ThreadLocal的使用

本文详细介绍了ThreadLocal的概念及其在保证线程间数据隔离性方面的优势,通过实例展示了如何在Java中使用ThreadLocal实现单线程状态的持久化,确保了线程间的数据独立性。

 用途

当前线程的存储信息,每个线程独享. 比如用户浏览访问的节点信息,保证访问节点与存储节点的一致.

代码:

下面用一个简单的案例来说明怎么使用ThreadLocal

package fx;

/**
 * 线程存储工具类
 * @author lxz
 *
 */
public class UserThreadLocalUtil {
    
    private static ThreadLocal<Integer> t1 = new ThreadLocal<Integer>();//存储年龄
    private static ThreadLocal<String> t2 = new ThreadLocal<String>();//存储姓名

    public static ThreadLocal<Integer> getT1() {
        return t1;
    }

    public static void setT1(ThreadLocal<Integer> t1) {
        UserThreadLocalUtil.t1 = t1;
    }

    public static ThreadLocal<String> getT2() {
        return t2;
    }

    public static void setT2(ThreadLocal<String> t2) {
        UserThreadLocalUtil.t2 = t2;
    }

    public static void main(String[] args) {
        Runnable thread1 = new Runnable() {

            public void run() {
                UserThreadLocalUtil.getT1().set(18);
                UserThreadLocalUtil.getT2().set("小明");
                while(true){
                    System.out.println(UserThreadLocalUtil.getT1().get());
                    System.out.println(UserThreadLocalUtil.getT2().get());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Runnable thread2 = new Runnable() {

            public void run() {
                UserThreadLocalUtil.getT1().set(20);
                UserThreadLocalUtil.getT2().set("小红");
                while(true){
                    System.out.println(UserThreadLocalUtil.getT1().get());
                    System.out.println(UserThreadLocalUtil.getT2().get());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread tt1 = new Thread(thread1);
        Thread tt2 = new Thread(thread2);
        tt1.start();
        tt2.start();
    }
}

测试结果:

18
小明
20
小红
18
小明
20
小红
18
20
小红
小明

通过结果发现,即使调用的是static的工具类,两个线程获取的值互相不干扰.

 

posted on 2016-02-25 15:30  'Note' 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/qinggege/p/5217154.html

ThreadLocal是一个Java类,用于在多线程环境下保存线程本地变量的副本。通过创建ThreadLocal对象,每个线程都可以拥有自己独立的变量副本,互不干扰。 使用ThreadLocal的过程如下: 1. 创建一个ThreadLocal对象,可以指定泛型类型。 2. 在每个线程中,通过ThreadLocal对象的`get()`方法获取当前线程的变量副本。如果当前线程没有设置过变量值,则会使用默认值进行初始化。 3. 在每个线程中,通过ThreadLocal对象的`set(value)`方法设置当前线程的变量值。 4. 在每个线程中,通过ThreadLocal对象的`remove()`方法移除当前线程的变量副本。 需要注意的是,ThreadLocal对象的生命周期与Thread对象的生命周期一样长。当ThreadLocal对象被垃圾回收时,关联的变量副本也会被回收。 在ThreadLocal内部,使用ThreadLocalMap来存储每个线程的变量副本。ThreadLocal的实例作为key,变量值作为value。ThreadLocalMap可以使用强引用或弱引用来引用ThreadLocal对象。如果使用强引用,当ThreadLocal对象被回收时,如果没有手动删除对应的变量副本,会导致内存泄漏。如果使用弱引用,当ThreadLocal对象被回收时,对应的变量副本也会被回收。 总结来说,ThreadLocal是一种线程本地变量,通过保存每个线程的变量副本,实现了多线程环境下的线程隔离。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ThreadLocal使用与原理](https://blog.youkuaiyun.com/qq_35190492/article/details/116431270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ThreadLocal使用详解](https://blog.youkuaiyun.com/LJJZJ/article/details/88763666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值