總結(jié):
- Static聲明的ThreadLocal修飾的變量,為線程私有顾患,即某個線程修改之后對其他線程沒有影響
- Static聲明的基本類型變量暇检,為全局共享,即任意一個線程修改之后深寥,對其他線程是可見的攘乒,記得加volatile
如果在ThreadLocal變量前加volatile,不會生效
public class ThreadLocalTest {
//聲明一個Threadlocal變量惋鹅,包裝的是Boolean類型则酝,初始化false
static ThreadLocal<Boolean> local = new ThreadLocal<Boolean>(){
@Override
protected Boolean initialValue() {
return false;
}
};
private static ThreadLocalTest instance;
//雙重
public static ThreadLocalTest getInstance(){
if(instance==null){
synchronized (ThreadLocalTest.class) {
if(instance==null){
instance = new ThreadLocalTest();
}
}
}
return instance;
}
public void set(boolean value){
local.set(value);
}
public boolean get(){
return local.get();
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest.getInstance().get());//false
ThreadLocalTest.getInstance().set(true);
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest.getInstance().get());//true
new Thread(new Runnable() {
public void run() {
//ThreadLocalTest.getInstance().set(true);
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest.getInstance().get()); //true
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest.getInstance().get());//false
}
}).start();
}
}
public class ThreadLocalTest2 {
static Boolean flag = false; //將threadlocal變量換成普通類型變量
private static ThreadLocalTest2 instance;
public static ThreadLocalTest2 getInstance(){
if(instance==null){
synchronized (ThreadLocalTest2.class) {
if(instance==null){
instance = new ThreadLocalTest2();
}
}
}
return instance;
}
public void set(boolean value){
flag = value;
}
public boolean get(){
return flag;
}
public static void main(String[] args) {
//第一次為false,因為默認(rèn)是false
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest2.getInstance().get());//false
//設(shè)置一次之后闰集,全局共享
ThreadLocalTest2.getInstance().set(true);
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest2.getInstance().get());//true
//該變量對其他線程都是共享的
new Thread(new Runnable() {
public void run() {
//ThreadLocalTest2.getInstance().set(true); //如果將賦值語句放在此處沽讹,將上面的set注釋掉般卑,運行幾次看看結(jié)果是否還一樣
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest2.getInstance().get()); //true
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+":"+ThreadLocalTest2.getInstance().get());//true
}
}).start();
}
}