多线程中,有时候需要调用多线程的时候需要传参,如果全局变量用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, 那就相当于全局变量, 是所有线程共享的了.