zoukankan      html  css  js  c++  java
  • 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());
        }
    }
  • 相关阅读:
    OutOfMemoryError异常穷举
    Java的锁优化
    Java的线程安全
    Java的线程模型
    算法笔记_014:合并排序(Java)
    算法笔记_013:汉诺塔问题(Java递归法和非递归法)
    算法笔记_012:埃拉托色尼筛选法(Java)
    算法笔记_011:希尔排序
    算法笔记_010:插入排序(Java)
    算法笔记_009:字符串匹配(Java)
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/7467387.html
Copyright © 2011-2022 走看看