线程 -- ThreadLocal

1,ThreadLocal 不是“本地线程”的意思,而是Thread 的局部变量。每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本

2,提供的接口方法

• void set(Object value)设置当前线程的线程局部变量的值。

• public Object get()该方法返回当前线程所对应的线程局部变量。

• public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

• protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

3,两个线程共享资源的情况

public class Res {

    public Integer count = 0;

    public Integer getNum() {
        return ++count;
    }
}
public class CountThread implements Runnable {
    private Res res;

    public CountThread(Res res) {
        this.res = res;
    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName() + "----" + res.getNum());
        }
    }
}
public class App {
    public static void main(String[] args) {
        //共享资源;
        Res res = new Res();
        CountThread countThread = new CountThread(res);
        Thread t1 = new Thread(countThread);
        Thread t2 = new Thread(countThread);
        t1.start();
        t2.start();

    }

}

打印结果:线程不安全

Thread-0----1
Thread-1----1
Thread-0----2
Thread-0----4
Thread-1----3
Thread-1----5

使用ThreadLocal 让每个线程单独拥有自己的局部变量

public class Res {

    public ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
        //每个线程只会调用一次
        protected Integer initialValue() {
            return 0;
        };
    };

    public Integer getNum() {
        int count = threadLocal.get() +1;
        threadLocal.set(count);
        return count;
    }
}

打印结果:

Thread-0----1
Thread-0----2
Thread-1----1
Thread-1----2
Thread-1----3
Thread-0----3

原文地址:https://www.cnblogs.com/pickKnow/p/11022906.html

时间: 2024-10-02 04:45:08

线程 -- ThreadLocal的相关文章

本地线程-ThreadLocal

线程本地存储是一个自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储.简单来说,就是对于某个变量,针对不同的线程存储不同的值. 实例: import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @Description * @Author

java笔记--用ThreadLocal管理线程,Callable&lt;V&gt;接口实现有返回值的线程

用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3899890.html  "谢谢-- Callable<V>接口类似于Runnable,两者都是为了哪些其实例可能被另一个线程执行的类设计的, 但是Runnable不会返回

ThreadLocal工具类做缓存(线程隔离思想)

public class ThreadLocalCache { private static ThreadLocal<Map<String, Object>> cache=new ThreadLocal<Map<String,Object>>(); /** * 从ThreadLocal里获取缓存的值 * @param key 要获取的数据的KEY * @return 要获取的值 */ public static Object getCache(String

Java多线程9:ThreadLocal源码剖析

http://www.cnblogs.com/xrq730/p/4854813.html ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是干什么用的.再使用.最后总结,讲解ThreadLocal采取这样的思路. 三个理论基础 在剖析ThreadLocal源码前,先讲一下ThreadLocal的三个理论基础: 1.每个线程都有一个自己的ThreadLocal.ThreadLoca

Spring单例与线程安全小结

转:http://www.cnblogs.com/doit8791/p/4093808.html 一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时

Android线程管理(二)&mdash;&mdash;ActivityThread

线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用.本小节主要从以下三个方面进行分析: <Android线程管理(一)--线程通信> <Android线程管理(二)--ActivityThread>  <Android线程管理(三)--Thread类的内部原理.休眠及唤醒> 二.ActivityThread的主要工作及实现机

java多线程17:ThreadLocal源码剖析

ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是干什么用的.再使用.最后总结,讲解ThreadLocal采取这样的思路. 三个理论基础 在剖析ThreadLocal源码前,先讲一下ThreadLocal的三个理论基础: 1.每个线程都有一个自己的ThreadLocal.ThreadLocalMap对象 2.每一个ThreadLocal对象都有一个

聊一聊ThreadLocal

对于ThreadLocal感兴趣是从一个问题开始的:ThreadLocal在何种情况下会发生内存泄露?对于这个问题的思考不得不去了解ThreadLocal本身的实现以及一些细节问题等.接下去依次介绍ThreadLocal的功能,实现细节,使用场景以及一些使用建议. 概述 ThreadLocal不是用来解决对象共享访问问题的,而主要提供了线程保持对象的方法和避免参数传递的方便的对象访问方式.一般情况下,通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是不需要访问

Java学习之ThreadLocal

转自:http://www.cnblogs.com/doit8791/p/4093808.html#3197185 在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量.这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大. 而ThreadLocal则从另一个角度来解决多线程的并发访问.ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访