您的位置:首页 > 其它

j2ee高并发时使用全局变量需要注意的问题

2014-03-20 14:29 666 查看
开发中,全局变量的使用很频繁,但对于多线程的访问,使用全局变量需要注意的地方有很多,下面做了个大概的总结。

全局变量的使用场合:

1:定义只读的全局变量时,必须加final修饰,防止被修改。哪怕是私有的,也得加final,防止被反射修改。

2:对于需要多次读写的全局变量,一定要用ThreadLocal封装,避免多线程并发时变量被多次赋值等不安全的一些现象。

 ThreadLocal封装静态全局变量和私有全局变量的代码示例:

import java.util.ArrayList;
import java.util.List;

public class RollDice {

//ThreadLocal封装静态变量
public static ThreadLocal<List<Object>> threadRollList = new ThreadLocal<List<Object>>(){
//这里加同步是因为ThreadRollList是静态全局变量,防止ThreadLocal本身被并发。
@Override
protected synchronized List<Object> initialValue() {
return new ArrayList<Object>(0);
}
};
//用此种方式定义全局变量,遭遇多线程并发时,会出现bug.
public static List<Object> rollList = new ArrayList<Object>(0);

//私有全局变量
public ThreadLocal<List<Object>> priTreadRollList = new ThreadLocal<List<Object>>(){

//因为是私有变量,ThreadLocal本身会被放进线程,所以不用担心并发,因此也不需要synchronized。
@Override
protected List<Object> initialValue() {
return new ArrayList<Object>(0);
}

};

//调用方式
public static void main(String[] args) {
//ThreadLocal调用方式
threadRollList.get().add(new Object());
//普通定义调用方式
rollList.add(new Object());
}

}


这里再扩展一下解决并发问题的两种常用的方案并进行对比:

使用synchronized来修饰,此方法相当于单线程队列执行,需要等待,有损性能,好处是不会增加内存的额外开销。

使用ThreadLocal封装变量,相当于把变量丢进执行线程中去,每new一个新的线程,变量也会new一次(不一定每次都new,这个要看程序怎么写。),对性能没有影响,但会增加系统额外的内存开销,但其执行完毕就销毁的机制使得ThreadLocal变成比较优化的并发解决方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐