学习目标:
首先要明确 :线程安全问题都是由全局变量及静态变量引起的。
在多线程高并发的场景下,为了使得各个线程能够安全的按照程序员预想的方式运行,需要使用一些关键字来达成。
今天要讲的就是其中两个重要的关键字,ThreadLocal和volatile。
例如:
- 一周掌握 Java 入门知识
ThreadLocal:
如上图所示,多线程运行之初,实例化了一个公共对象 MyDemo01,并且完成了实例化,接着各个线程要操作这个公共对象 demo,把自己的线程名称存入到demo中,随后再把该值输出出来,这样一个流程。
不使用ThreadLocal和synchronized出现的问题
多个线程同时运行的情况下,由于资源没有上锁,所以可能出现第一个线程,刚刚设置了demo的cotent值,在输出之前,就被第二个线程重新设置content值给覆盖掉了,导致线程1输出的结果是线程2的名称。
使用synchronized出现的问题
在多线程同时运行的情况下,给资源加锁,这时候,每次给demo设置值的时候,只会有一个线程接近资源,也只有一个线程来输出,只有该线程执行完资源的时候,才会释放锁,此时才会有下一个线程来得到锁,从而拿到资源。
确实是解决了,线程不安全的问题,但是每次线程只能排队来获取资源,这样特别影响性能。
使用ThreadLocal
在多线程同时运行的情况下,使用ThreadLocal 这个空间,它是属于线程私有的一个空间,这样的话,首先资源可以在高并发的情况下被多个线程使用,并且ThreadLocal的线程隔离性,也保证了线程安全。