同步队列
∵ 多线程 ∴ 需要针对一些资源进行同步 ∴ 有了同步队列
实现方式主要有两种:阻塞方式(队列使用一个锁,出队入队用同一把锁或者队列使用两把锁,出队和入队用不同的锁)和非阻塞方式(底层通过循环CAS的方式)
synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁
CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。Compare And Swap 比较并替换
以数据库连接为例,如果多个线程共享一个连接,有可能一个线程在对数据库进行操作,另一个线程调用了closeConnection操作;如果在每一个线程都new一个连接对象,如果开启关闭数据库操作频繁,会影响到服务器压力,并且影响程序执行性能。
=> ThreadLocal 内部维护一个 ThreadLocalMap 类,保存的是 Entry<Thread K, Object V> 数组,K是线程,V是值,这样每一个线程无论在哪里调用,都会拿到自己线程的值
每个Thread对象中都持有一个ThreadLocalMap的成员变量。每个ThreadLocalMap内部又维护了N个Entry节点,也就是Entry数组,每个Entry代表一个完整的对象,key是ThreadLocal本身,value是ThreadLocal的泛型值