ThreadLocal类简介说明

欣喜 Java经验 发布时间:2024-02-23 17:25:29 阅读数:10234 1
下文笔者讲述ThreadLocal示例简介说明,如下所示

ThreadLocal简介

ThreadLocal是 ThreadLocal是Java 中一个类
    用于在多线程环境下实现线程本地变量
    它提供一种机制
     使得每个线程都可以拥有自己的变量副本
      从而避免了线程间共享变量的竞争和同步问题。

ThreadLocal功能:
    将变量与当前线程关联起来 
    使得每个线程都可以访问到自己的变量副本
     而不会影响其他线程
     通过使用ThreadLocal,可以在多个线程中安全地访问和修改线程本地变量,而无需使用显式的同步机制。
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.java265");
              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());
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202402/17086811208031.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者