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()); } }
时间: 2024-10-11 21:00:38