j2ee高并发时使用全局变量需要注意的问题
2014-03-20 14:29
666 查看
开发中,全局变量的使用很频繁,但对于多线程的访问,使用全局变量需要注意的地方有很多,下面做了个大概的总结。
全局变量的使用场合:
1:定义只读的全局变量时,必须加final修饰,防止被修改。哪怕是私有的,也得加final,防止被反射修改。
2:对于需要多次读写的全局变量,一定要用ThreadLocal封装,避免多线程并发时变量被多次赋值等不安全的一些现象。
ThreadLocal封装静态全局变量和私有全局变量的代码示例:
这里再扩展一下解决并发问题的两种常用的方案并进行对比:
使用synchronized来修饰,此方法相当于单线程队列执行,需要等待,有损性能,好处是不会增加内存的额外开销。
使用ThreadLocal封装变量,相当于把变量丢进执行线程中去,每new一个新的线程,变量也会new一次(不一定每次都new,这个要看程序怎么写。),对性能没有影响,但会增加系统额外的内存开销,但其执行完毕就销毁的机制使得ThreadLocal变成比较优化的并发解决方案。
全局变量的使用场合:
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变成比较优化的并发解决方案。
相关文章推荐
- 在Python中使用全局日志时需要注意的问题
- 5.1 Python 函数-默认参数,*args,**kwargs的使用;作用域-局部空间使用全局变量需要注意的事项等
- DLL中导出全局变量的方法及导入时需要注意的问题
- 张宴:在高并发应用中,Cache的作用不可忽视,在Cache的使用上,有哪些问题需要去注意?
- SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题
- 在Python中使用全局日志时需要注意的问题
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 用vs编译动态库需要注意的问题,全局变量初始化
- spring 容器后处理器 BeanFactoryPostProcessor 使用需要注意的一个问题
- hbase使用中需要注意一些问题
- PHP使用redis安装时需要注意的问题
- 教你发布Silverlight Bussiness Application(SQL Server 登录,局域网访问,以及使用ArcGIS Server服务需要注意的问题)
- Android用类继承Application的全局变量使用注意
- Twitter的分布式自增ID算法snowflake的JAVA实现以及使用时需要注意的问题
- 使用Kubernetes需要注意的一些问题(FAQ of k8s)
- 使用GDI+时需要注意的几个问题
- 使用string.Format需要注意的一个性能问题
- 使用引用形参需要注意的问题
- 实例解析使用指针作为函数参数传递需要注意的问题
- 使用angularjs实现二级联动需要注意的问题如下