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

j2ee高并发时使用全局变量需要注意的问题的更多相关文章

  1. 关于sphinx+PHP在高并发时响应性能低下的解决办法

    经过多次压力测试,发现sphinx在高并发时出现负载突然提升,并且响应速度明显下降.经过多方面的排查,发现是由于PHP与sphinx自带的 searchd进行socket的连接之后,系统内存有大量的T ...

  2. [转]你如何面对—LNMP高并发时502

    From : http://www.topthink.com/topic/5683.html 之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-f ...

  3. J2ee高并发情况下监听器

    引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置參数(最大并发数),并设置其它相关參数.具体见代码. 第一步:配置web.xml配置,不懂的地方解释一下:參数50通过參数名maxCon ...

  4. php session在高并发时可能存在的问题。

    如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行.这是因为在默认情况下,PHP使用文件存储Session数 ...

  5. 高并发Web服务的演变:节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  6. 转---高并发Web服务的演变——节约系统内存和CPU

    [问底]徐汉彬:高并发Web服务的演变——节约系统内存和CPU 发表于22小时前| 4223次阅读| 来源CSDN| 22 条评论| 作者徐汉彬 问底Web服务内存CPU并发徐汉彬 摘要:现在的Web ...

  7. 高并发 Web 服务的演变:节约系统内存和 CPU

    本文内容 越来越多的并发连接数 Web 前端优化,降低服务端压力 节约 Web 服务端的内存 节约 Web 服务器的 CPU 小结 一,越来越多的并发连接数 现在,Web 系统面对的并发连接数呈现指数 ...

  8. (转)高并发Web服务的演变——节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  9. 高并发WEB服务的演变

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加 Web系统的机器和升级硬件配置.虽然 ...

随机推荐

  1. 【置换群/模拟】NOIP2005-篝火晚会

    [问题描述] 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们 ...

  2. linux中django部署

    下载nginx yum install nginx rpm -ql nginx systemctl start nginx /usr/share/nginx/html # html页面 /etc/ng ...

  3. Problem G: 部分复制字符串

    #include <stdio.h> #include <string.h> int main() { void copystr(char *,char *,int); int ...

  4. [典型漏洞分享]YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

    YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述: YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口 ...

  5. NHibernate官方文档中文版-框架架构(Architecture)

    总体概览 一个非常高层次的NHibernate架构: 这个图展示了NHibernate使用数据库和配置信息来为应用程序提供持久化服务(和持久化对象). 我们想展示一个更加详细的运行时架构.但是NHib ...

  6. Inno Setup入门(十七)——Inno Setup类参考(3)

        标签 标签(Label)是用来显示文本的主要组件之一,也是窗口应用程序中最常用的组件之一,通过对标签的使用,将能够给用户提供更加详细的信息. Pascal脚本中的标签由类TlLabel实现,该 ...

  7. 最快的csv文件入到数据库的方法

    最快的csv文件入到数据库的方法:EXEC master.sys.sp_configure 'show advanced options', 1 ; RECONFIGURE ; EXEC master ...

  8. uboot显示logo的方式

    转:http://blog.chinaunix.net/uid-22030783-id-3257554.html 本文使用uboot2010.03版本,2010.06版本同样适用,在XC2440板上实 ...

  9. FORM-加载前指定日期时间格式

    PRE-FORM -- Standard date format --BEGIN  set_application_property(DATE_FORMAT_COMPATIBILITY_MODE, ' ...

  10. linux下编译运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C.C++.Ada.Fortran.Objective.Perl.Python.Ruby以及Ja ...