多線程中,全局變量用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, 那就相當於全局變量, 是所有線程共享的了.

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