线程安全的解决方案(ThreadLocal详解)

ThreadLocal

  • 1.线程安全的解决方案
    • (1)选择ThreadLocal还是锁?
    • (2)ThreadLocal的使用方法
    • (3)ThreadLocal的创建和初始化
    • (4)ThreadLocal的底层实现及使用场景
    • (5)ThreadLocal的缺点
    • (6)为什么ThreadLocal会将key设置为弱引用?
    • (7)Java引用类型(4种)
    • (8)哈希冲突的解决方案是不同

1.线程安全的解决方案

  • 1.加锁(synchronized 、Lock:加锁可以解决线程安全的问题,但因为排队处理,所以会带来一定的性能消耗)
    线程安全的解决方案(ThreadLocal详解)_第1张图片
  • 2.设置私有变量

有没有一种方案既可以避免加锁排队执行,又不会每次执行任务都需要重新创建私有变量呢?

答:有。ThreadLocal线程的本地变量,每个线程创建一个私有变量(以1000个任务10个线程池的实例来说,使用ThreadLocal就是创建10个SimpleDateFormat对象)。

(1)选择ThreadLocal还是锁?

  • 就要看创建实例对象之后的复用率,复用率高就使用ThreadLocal。
  • 如:实现1000个任务的时间格式化。–>线程池、SimpleDateFormat(全局)—>线程不安全的问题

(2)ThreadLocal的使用方法

  • 1.set(): 将私有变量设置到线程。(给线程中存线程变量的)
  • 2.get(): 获取线程中的私有变量。
  • 3.remove(): 将私有变量从线程中移除。
public class ThreadPoolDemo {
   
    private static ThreadLocal<SimpleDateFormat> threadLocal=new ThreadLocal<>();
    public static void main(String[] args) {
   
        //设置私有变量
        threadLocal.set(new SimpleDateFormat("mm:ss"));
        //得到ThreadLocal
        SimpleDateFormat simpleDateFormat=threadLocal.get();
        Date date=new Date(1000);
        String result=simpleDateFormat.format(date);
        System.out.println("时间:"+result);
    }
}
//创建线程私有变量
    private static ThreadLocal<String> threadLocal=new ThreadLocal<>();
    public static void

你可能感兴趣的:(多线程,thread,多线程,线程安全)