美文网首页
多线程之ThreadLocal

多线程之ThreadLocal

作者: vaneL | 来源:发表于2017-08-03 21:39 被阅读0次

Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。

  1. 创建一个ThreadLocal对象
private ThreadLocal myThreadLocal = new ThreadLocal();
  1. 访问ThreadLocal对象
//get()方法会返回一个Object对象,而set()方法则依赖一个Object对象参数
myThreadLocal.set("A thread local value");
String threadLocalValue = (String) myThreadLocal.get();
  1. ThreadLocal泛型
private ThreadLocal myThreadLocal1 = new ThreadLocal<String>();
myThreadLocal1.set("Hello ThreadLocal");
String threadLocalValues = myThreadLocal.get();
  1. 初始化ThreadLocal
//在set()方法调用前,当调用get()方法的时候,所有线程都可以看到同一个初始化值
private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
   @Override protected String initialValue() {
       return "This is the initial value";
   }
};

5.例子

public class ThreadLocalTest {
    private static ThreadLocal<Integer> x=new ThreadLocal<Integer>();
    private static ThreadLocal<MyThreadScopeData> myThreadScopeData=new ThreadLocal<MyThreadScopeData>();
    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int data = new Random().nextInt() ;
                    System.out.println(Thread.currentThread().getName() + ":" + data);
                    x.set(data);
                    MyThreadScopeData.getInstance().setName("name  "+data+"  ");
                    MyThreadScopeData.getInstance().setAge(data);
                    new A().get();
                    new B().get();
                }
            }).start();
        }
    }
    static class A{
        public void get(){
            int data=x.get();
            System.out.println("A--"+Thread.currentThread().getName()+":"+data);
            MyThreadScopeData myData=MyThreadScopeData.getInstance();
            System.out.println("A--"+Thread.currentThread().getName()+" getData:  "+myData.getName()+"age:   "+myData.getAge());
        }
    }
    static class B{
        public void get(){
            int data=x.get();
            System.out.println("B--"+Thread.currentThread().getName()+":"+data);
            MyThreadScopeData myData=MyThreadScopeData.getInstance();
            System.out.println("B--"+Thread.currentThread().getName()+" getData:"+myData.getName()+"age:"+myData.getAge());
        }
    }
}

class MyThreadScopeData{

    private MyThreadScopeData(){}
    public static MyThreadScopeData getInstance(){   //饥汉模式
        MyThreadScopeData instance=map.get();
        if(instance==null){
            instance=new MyThreadScopeData();
            map.set(instance);
        }
        return instance;
    }
    //饱汉模式 private static MyThreadScopeData instance=new MyThreadScopeData();
    //private static MyThreadScopeData instance=null;
    private static ThreadLocal<MyThreadScopeData> map=new ThreadLocal<MyThreadScopeData>();

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

输出结果:
Thread-1:585994092
A--Thread-1:585994092
A--Thread-1 getData: name 585994092 age: 585994092
B--Thread-1:585994092
B--Thread-1 getData:name 585994092 age:585994092
Thread-0:-1879022169
A--Thread-0:-1879022169
A--Thread-0 getData: name -1879022169 age: -1879022169
B--Thread-0:-1879022169
B--Thread-0 getData:name -1879022169 age:-1879022169

相关文章

网友评论

      本文标题:多线程之ThreadLocal

      本文链接:https://www.haomeiwen.com/subject/sglmlxtx.html