并发严重的情况下,使用锁的效率低下,因为同一时刻只能有一个线程可以获得锁,Java提供了并发包来解决这个问题
HashMap是线程不安全的数据结构,HashTable则在HashMap基础上,get方法和put方法加上Synchronized修饰变成线程安全,不过在高并发情况下效率底下,最终被ConcurrentHashMap替代
ConcurrentHashMap 采用分段锁,内部默认有16个桶,get和put操作,首先将key计算hashcode,然后跟16取余,落到16个桶中的一个,然后每个桶中都加了锁(ReentrantLock),桶中是HashMap结构(数组加链表,链表过长转红黑树)
所以理论上最多支持16个线程同时访问
链表结构的阻塞队列,内部使用多个ReentrantLock
notEmpty.await进入等待notEmpty.signal,通知消费者,1中等待结束,唤醒继续执行notFull.signal,通知生产者继续生产notFull.await,等待消费者消费掉,也就是等待3去取数据并且发出notFull.signal,这时候生产者才能继续生产内部采用CAS(compare and swap)保证原子性;常见的有以下几个