https://www.bilibili.com/video/BV1BJ411G7Pp?p=13
小结:
所以对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而 ThreadLocal 采用了“以空间换时间”的方式
synchronized(Lock) 仅提供一份变量,让不同的线程排队访问而 ThreadLocal 为每一个线程都提供了一份变量,因此可以同时访问而互不影响;
ThreadLocal 和线程同步机制 synchronized(Lock) 都是为了解决多线程环境下相同变量的访问冲突问题
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量,这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和編写难度相对较大;
而 ThreadLocal 则从另一个角度来解决多线程的并发访问, ThreadLocal 会为每个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。
因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了
ThreadLocal提供了线程安全的共享对象,且 ThreadLocal 中可以持有任何类型的对象,在编写多线程代码时,可以把不安全的变量封装进 ThreadLocal
所以对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而 ThreadLocal 采用了“以空间换时间”的方式
synchronized(Lock) 仅提供一份变量,让不同的线程排队访问而 Threadlocal 为每一个线程都提供了一份变量,因此可以同时访问而互不影响;