原文:https://blog.csdn.net/jston_learn/article/details/21617311

开发中,全局变量的使用很频繁,但对于多线程的访问,使用全局变量需要注意的地方有很多,下面做了个大概的总结。

全局变量的使用场合:

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变成比较优化的并发解决方案。

最新文章

  1. Spark——共享变量
  2. 基于modelsim-SE的简单仿真流程—上
  3. miniui
  4. ANdroid5.0不能隐式启动service,必须显示,解决办法,加服务端包名
  5. AC 自动机
  6. oracle 未找到提供程序。该程序可能未正确安装
  7. spring+websocket整合
  8. [terry笔记]dblink
  9. HDU/杭电2013多校第三场解题报告
  10. coffeeScript demo
  11. vertical-align:top属性
  12. C# 知识点回顾
  13. os内存使用管理之unix-AIX篇
  14. Java模拟POST表单提交HttpClient操作
  15. BestCoder Round #92 (hdu_6015 6016)
  16. Html5笔记之第七天
  17. 201521123032《Java程序设计》第5周学习总结
  18. [Project] Simulate HTTP Post Request to obtain data from Web Page by using Python Scrapy Framework
  19. 使用RestTemplate访问restful服务时遇到的问题
  20. 04-GIT TortoiseGit冲突和补丁演示 案例演示

热门文章

  1. hdu 1384 Intervals (差分约束)
  2. 【计算几何】【圆反演】hdu6097 Mindis
  3. 【SAM】POJ1509-Glass Beads
  4. Scala 匿名函数
  5. .NET开源免费的功能强大控件库
  6. 多线程--Task,等待用户输入AutoResetEvent
  7. 通配置文件的方式控制java.util.logging.Logger日志输出
  8. RES协议
  9. python的lxml解析器
  10. Delphi中Frame的使用方法(2)