全局变量就是不管你在哪里, 都能够直接引用的变量, 还不用担心各种问题. 第个语言都有自己的全局变量, 我想!
一般地, 面向过程的语言当中, 可能就是一个声明在最前面的变量, 后面的代码直接引用, 就成了全局变量!(最经典的 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 对于一般的开发工作, 用处不一定很多, 但是对于框架一类操作就比较有用了.
来源: http://www.tuicool.com/articles/Br2IJjM