多线程中,全局变量用static修饰导致变量被共享

 

多线程中,有时候需要调用多线程的时候需要传参,如果全局变量用static修饰,会导致变量被共享,这些变量值被用到的时候不一定会是最新的。 

public class SqlQueryThread  implements Callable {
	private static Logger logger = LoggerFactory.getLogger(SqlQueryThread.class);
 	
	private static String sql;
	private static String dbInfo;
	private static String paramsList;
	private static HttpSession  session;

public SqlQueryThread(String sql ,String dbInfo ,String paramsList , HttpSession session) {
		// 重写构造,可以对线程添加名字
		super();
		
		this.sql = sql;
		this.dbInfo = dbInfo;
		this.paramsList = paramsList;
		this.session = session;
	}

}

 另外如果多线程访问同一个变量,需要对这个变量进行加锁, 所以最终应该改成下面这种写法:

	private  volatile String sql;
	private  volatile String dbInfo;
	private  volatile String paramsList;
	private   volatile HttpSession  session;

 

总结:如果你的变量没有加 static, 那么每个线程进入这个函数时会从线程的栈里面来分配变量, 是不会被共享的.
如果你加了 static, 那就相当于全局变量, 是所有线程共享的了.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C++ ,`static` 修饰符可以应用于指针,这与普通指针(未加 `static`)有以下几个主要区别: 1. **存储位置**: - 普通指针:它只是一个变量,用来存储另一个变量的地址。每次程序执行时,它的值可能会改变,取决于动态分配的对象的位置。 - `static` 指针:静态指针在内存只有一份,且它的值在整个程序执行期间保持不变。如果初始化为全局变量或静态局部变量的地址,它会指向那个特定对象。 2. **生命周期**: - 普通指针:如果它不指向动态内存,那么当它所在的栈帧或作用域结束时,指针通常会变为野指针(dangling pointer)。 - `static` 指针:如果是指向全局变量或静态局部变量的,即使对应的作用域结束,其值也会继续存在,直到程序结束或再次初始化。 3. **初始化**: - 普通指针:如果没有明确的初始化,它会指向不确定的内存地址,可能导致未定义的行为。 - `static` 指针:如果没有初始化,它默认为 `nullptr`,除非显式赋值。 4. **静态数组指针**: 如果指针指向静态数组,`static` 修饰可以表示整个数组,而不是单个元素,如 `static int arr[10]; static int* p = arr;` 这样 `p` 就指向整个数组。 5. **线程安全**: 在多线程环境下,普通指针可能不是线程安全的,因为它们可能在不同的线程修改。而静态指针在同一程序范围内是线程共享的。 相关问题-- 1. 静态指针何时自动初始化为 `nullptr`? 2. 静态指针和普通指针在内存管理上有哪些差异? 3. 为什么在多线程环境要使用 `static` 指针?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值