5.1 ThreadLocal 的原理
ThreadLocal 的主要目的是用来实现多线程环境下的变量隔离
·【解释】即每个线程自己用自己的资源,这样就不会出现共享,没有共享,就不会有多线程竞争的问题原理
每个线程对象内部有一个 ThreadLocalMap,它用来存储这些需要线程隔离的资源
资源的种类有很多,比如说数据库连接对象、比如说用来判断身份的用户对象.
怎么区分它们呢,就是通过 ThreadLocal,它作为ThreadLocalMap 的 key,而真正要线程隔离的资源作为ThreadLocalMap 的value
ThreadLocal.set 就是把 ThreadLocal 自己作为 key,隔离资源作为值,存入当前线程的ThreadLocalMap
ThreadLocal.get 就是把 ThreadLocal 自己作为 key,到当前线程的 ThreadLocalMap 中去查找隔离资源
。ThreadLocal 一定要记得用完之后调用remove0 清空资源,避免内存泄漏
5.2 解释悲观锁与乐观锁
悲观锁
·像 synchronized,Lock这些都属于悲观锁
如果发生了竞争,失败的线程会进入阻塞
【理解】悲观的名字由来:害怕其他线程来同时修改共享资源,因此用互斥锁让同一时刻只能有一个线程来占用共享资源
乐观锁
·像 Atomiclnteger,AtomicReference 等原子类,这些都属于乐观锁
如果发生了竟争,失败的线程不会阻塞,仍然会重试
【理解】乐观的名字由来:不怕其他线程来同时修改共享资源,事实上它根本不加锁,所有线程都可以去修改共享资源,只不过并发时只有一个线程能成功,其它线程发现自己失败了,就去重试,直至成功适用场景
,如果竞争少,能很快占有共享资源,适合使用乐观锁
如果竞争多,线程对共享资源的独占时间长,适合使用悲观锁PS.
这里讨论 Java 中的悲观锁和乐观锁,其它领域如数据库也有这俩概念,当然思想是类似的