ThreadLocal类

package com.threadlocal;
/*
 *ThreadLocal类
 */
public class ThreadLocalDemo {
    public static void main(String[] args) {
         new Thread(new Runnable(){
            @Override
            public void run() {
              Message msg=new Message();
              msg.setNote("com.mldn");
              MyUtil.set(msg);
              MessageConsumer ms=new MessageConsumer();
              ms.print();
            }       
         },"用户A").start();
         new Thread(new Runnable(){
             @Override
             public void run() {
               Message msg=new Message();
               MyUtil.set(msg);
               msg.setNote("好好学习");
               MessageConsumer ms=new MessageConsumer();
               ms.print();
             }       
          },"用户B").start();
    }
}
/*
 * 为了是两个线程访问msg.getNote()的时候,都有自己的数据,互补影响
 * 采用ThreadLocal为其创建各自的局部变量:set(msg)
 */
class MyUtil{
    //private static  Message msg;//多线程访问修改了一个,数据是共享的,数据都变了
    private static  ThreadLocal threadLocal=new ThreadLocal();//当每一个线程访问某变量时,让其都有自己的局部变量
    /*
     * ThreadLocal:
     * 该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,
     * 因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。
     * ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 
     * 
     */
    public static void set(Message msg){
        threadLocal.set(msg);
    }
    public static Message get(){
        return (Message) threadLocal.get();
    }
}
class Message{
    private String note;
    
    public Message(){}
    
    public void setNote(String note){
        this.note=note;
    }
    public String getNote(){
        return note;
    } 
}
class MessageConsumer{
    /*public void print(Message msg){
        System.out.println(Thread.currentThread().getName()+"="+msg.getNote());
    }*/
    public void print(){
        System.out.println(Thread.currentThread().getName()+"="+MyUtil.get().getNote());
    }
}

 

posted @ 2017-09-02 18:46  scwyfy  阅读(111)  评论(0编辑  收藏  举报