Java基础(1)中ThreadLocal是如何实现线程安全的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3447个文字,预计阅读时间需要14分钟。
1. Java基础(1)—— ThreadLocal
1.1. ThreadLocal简介
ThreadLocal是一个泛型类,当我们在一个类中声明一个ThreadLocal变量时,每个线程都会拥有该变量的一个独立副本。例如:javaprivate ThreadLocal threadLocalFoo=new ThreadLocal(); 此时,不同的线程将持有threadLocalFoo变量的独立实例。 1. Java基础(1)——ThreadLocal 1.1. ThreadLocalThreadLocal是一个泛型类,当我们在一个类中声明一个字段:private ThreadLocal<Foo> threadLocalFoo = new ThreadLocal<>();时,这时候,即使不同的线程持有了该类的同一个实例,那么它们在访问该实例的threadLocalFoo的时候访问的是不同的Foo对象,这些Foo对象和这些线程是一一对应的关系,并被这些线程所私有,因此每个线程不需要对自己从threadLocalFoo获得的Foo实例进行加锁(加锁也没用啊),这种无锁化的设计提高了并行能力,但注意ThreadLocal并不是万能的,有些场景可以使用ThreadLocal(比如Spring中的事务),但有些场景它的语义就是必须对同一个对象实例进行加锁后独占地访问,比如单例模式,这种ThreadLocal就起不了作用了。
本文共计3447个文字,预计阅读时间需要14分钟。
1. Java基础(1)—— ThreadLocal
1.1. ThreadLocal简介
ThreadLocal是一个泛型类,当我们在一个类中声明一个ThreadLocal变量时,每个线程都会拥有该变量的一个独立副本。例如:javaprivate ThreadLocal threadLocalFoo=new ThreadLocal(); 此时,不同的线程将持有threadLocalFoo变量的独立实例。 1. Java基础(1)——ThreadLocal 1.1. ThreadLocalThreadLocal是一个泛型类,当我们在一个类中声明一个字段:private ThreadLocal<Foo> threadLocalFoo = new ThreadLocal<>();时,这时候,即使不同的线程持有了该类的同一个实例,那么它们在访问该实例的threadLocalFoo的时候访问的是不同的Foo对象,这些Foo对象和这些线程是一一对应的关系,并被这些线程所私有,因此每个线程不需要对自己从threadLocalFoo获得的Foo实例进行加锁(加锁也没用啊),这种无锁化的设计提高了并行能力,但注意ThreadLocal并不是万能的,有些场景可以使用ThreadLocal(比如Spring中的事务),但有些场景它的语义就是必须对同一个对象实例进行加锁后独占地访问,比如单例模式,这种ThreadLocal就起不了作用了。

