java中的全局变量如何实现?ThreadLocal~
全局变量就是不管你在哪里,都能够直接引用的变量,还不用担心各种问题。每个语言都有自己的全局变量,我想!
一般地,面向过程的语言当中,可能就是一个声明在最前面的变量,后面的代码直接引用,就成了全局变量!(最经典的C就是这样的)
如:js 中:
var a = "hello,a!"; alert(a); function fn1() {
var b = "hello, b!"
alert("global var a: " + a);
} fn1();
但是也有的语言是不允许直接引用的,如PHP:(以下代码是会报错的,因为php中不允许函数中直接引用全局变量)
<?php
$a = "hello, a!";
echo $a . "\n"; function fn1() {
$b = "hello, b!";
echo "global a is:" . $a . "\n";
} fn1();
需要加上 global关键词才行,php这么做的目的在于其没有规定的入口函数,不使用全局变量从而避免变量污染:
<?php $a = "hello, a!";
echo $a . "\n"; function fn1() {
global $a;
$b = "hello, b!";
echo "global a is:" . $a . "\n";
} fn1();
但是要在java中实现全局变量,可就没这么简单了。不是因为访问一个全局变量有问题,而是访问全局可变变量时,往往会引发线程安全问题,那么就不能够随便用全局变量了。
public class Constants {
public static String CONST_6 = "6";
}
在需要使用的地方,直接使用 Constants.CONST_6 = 7; 就行了。但是因为java天生就是多线程环境,假如再来一个线程也更改这个变量,那么就出问题了。同等情况下,其他语言则往往是多进程环境,不必考虑变量的线程安全问题。
当然了,java自然是考虑到有需要访问全局变量的需求的,所以有了,ThreadLocal,这个类就是保证了线程安全的,可以作为全局变量使用的。
public class GlobalVarManager {
private static ThreadLocal<GlobalVars> globalVars = new ThreadLocal<>(); public static GlobalVars getGlobalVars() {
return globalVars.get();
} public static void setGlobalVars(GlobalVars conn) {
globalVars.set(conn);
}
}
如上方法,在外面使用 set, get 方式,就可以做到全局变量共享了,还保证了线程安全。
ThreadLocal的操作有三个set,get,remove,其实现原理为,使用一个map存放变量,将该map放到当前线程中:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
ThreadLocal 对于一般的开发工作,用处不一定很多,但是对于框架一类操作就比较有用了。
java中的全局变量如何实现?ThreadLocal~的更多相关文章
- java中的全局变量、局部变量与静态常量的区别
java中的变量类型分类: 类变量:独立于方法之外的变量,用 static 修饰.实例变量:独立于方法之外的变量,不过没有 static 修饰.局部变量:类的方法中的变量.比如: public cla ...
- java中实现全局变量的功能
一.通过接口实现 二.通过静态变量 static声明 package test.autorun; import java.util.LinkedList; import java.util.Queu ...
- Java中的全局变量与局部变量
全局变量:也叫成员变量,是指在类中定义的变量:它在整个类中都有效 全局变量又可分为:类变量和实例变量 1.类变量:又叫静态变量 用static修饰 它可以直接用类名调用 也可以用对象调用 而 ...
- java中的全局变量与静态变量的区别与联系?有时候为什么专门定义静态变量。(标题党~~)
static代表“每个类一个”而不是“每个对象一个”.即静态变量是类的所有对象共有的. 1 static JFrame f; static MyDrawPanel ml; 整个应用程序如下: 定义在p ...
- Java中各种(类、方法、属性)访问修饰符与修饰符的说明
类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...
- Java中的 修饰符
java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符 访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...
- Java中的statickeyword具体解释
1.statickeyword主要有2个作用: ①为某特定的数据类型或者对象分配单一的存储空间.而与创建对象的个数无关. ②在不创建对象的情况下能够直接通过类名来直接调用方法或者使用类的属性. 2.s ...
- Java编程的逻辑 (82) - 理解ThreadLocal
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java中的内存处理机制和final、static、final static总结
Java中的内存处理机制和final.static.final static总结 装载自:http://blog.csdn.net/wqthaha/article/details/20923579 ...
随机推荐
- 使用Typescript实现依赖注入(DI)
前言DI总是和ico相辅相成的,如果想对DI有更多的了解,可以移步我的另一篇文章 依赖注入(DI)和控制反转(IOC),再次我就不多做赘述了. 前几天看见一道面试题,今天借这个话题想跟大家分享一下: ...
- Chapter_4_JAVA作业
一.类的封装,继承与多态 1.课前预习 1.1 举列现实生活中的封装,以及简述在程序中什么是属性的封装? 1.1.1 将东西捆绑在一起,如集成芯片:高压电线等等 1.1.2 封装就是将属性私有化,提供 ...
- echart 图例
说明:stack相同,两个bar合并但是不会重叠 如果需要重叠 用barGap: '-100%', 根据不同的需求来使用两者. <template> <div> echart ...
- zz-人生感悟
1. 社交感想 首先来看一下聪明人和普通人的区别是什么? 普通人思考问题都是一步一步的来,由A推理出B,B推导到C,再推导出D,最后得出E,然而聪明人却可以由A直接推算到E. 这就像开车,普通人的是手 ...
- python3 第二十八章 - 内置函数之List相关
Python包含以下函数: 序号 函数 实例 1 list.append(obj)在列表末尾添加新的对象 2 list.count(obj)统计某个元素在列表中出现的次数 3 list.ext ...
- 初识“FireBug”
今天学习前端知识又一次提到“FireBug”这款插件,现在,把今天学到的一点东西简单记录下来. 什么是FireBug FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件 ...
- PL/SQL Developer 破解方法~
1.有注册码的方式:亲自测试,立马见效 LicenseNumber : 999 productCode : 46jvnzf74ysf3mqm4hx4tvhcamh8gpe3v5 SeriesNumbe ...
- 异常:Caused by: java.sql.SQLException: Field 'cust_id' doesn't have a default value
异常: 由Java.q.L.SqLExpExt引起:字段“CuSTyID”没有默认值 Caused by: java.sql.SQLException: Field 'cust_id' doesn't ...
- 20155312 张竞予 Exp3 免杀原理与实践
Exp3 免杀原理与实践 目录 基础问题回答 (1)杀软是如何检测出恶意代码的? (2)免杀是做什么? (3)免杀的基本方法有哪些? 实验总结与体会 实践过程记录 正确使用msf编码器,msfveno ...
- 安装php rabbitmq扩展,继上一篇安装Rabbitmq
1 安装 rabbitmq-c,C 与 RabbitMQ 通信需要依赖这个库,这里只贴出正确的步骤,错误类型太多,不一一举例,大部分都是安装问题,缺少组件,安装目录问题 git clone git:/ ...