• 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());
        }
    }
  • 相关阅读:
    mongoDB Liunx下安装及配置
    Node.js WEB服务器(1)——编写简单的HTTP服务器
    MongoDB 和 NoSQL简介
    ES6的Promise浅析
    Node.js的模块系统
    Node.js的异步IO和事件轮询
    mybatis 关联表心得
    mustache 模板,用于构造html页面内容
    Python实现冒泡,选择排序
    文件路径太长无法删除 robocopy
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/7467387.html
Copyright © 2020-2023  润新知