多线程中,全局变量用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, 那就相当于全局变量, 是所有线程共享的了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章