多線程中,有時候需要調用多線程的時候需要傳參,如果全局變量用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, 那就相當於全局變量, 是所有線程共享的了.