1.为什么要设计可重入锁?
**当方法A拥有一个对象锁,而方法B也拥有一个对象锁,当方法B调用方法A时如果锁不是可重入的,那么此时就会发生死锁,所以设计可重入锁就是为了防止死锁。
-
ReentrantLock:信号量,实现限流,调用acquire方法…
**CountDownLouch:计数器(自定义初始值),每次调用countDown方法,计数器减一,当计数器减到0时,会执行await后面的代码。该计数器是一次性的,用完不会重置
**CyclicBarrier:循环屏障:与CountDownLouch相同,但是计数器减到0会重置为初始值,可多次使用 -
ConcurrentHashMap在JDK1.7使用的是分段锁,而JDK1.8采用CAS+volatile保证线程安全。
-
ConcurrentHashMap:
**JDK1.7使用segments数组+HashEntry(key,value)+链表,使用分段锁,每把锁只锁定容器中一部分数据,当多个线程访问不同数据段就不会发生锁竞争。提高并发效率。segments中包含了segment[i],每个segment[i]中有多个HashEntry,每个HashEntry包含一个key和链表的头结点。因为分段的原因,put和get需要进行二次哈希定位具体元素,首先定位在那个segment[i]中,再找具体的值。
**JDK1.8使用synchronized+CAS+数组+节点+红黑树,只使用synchronized同步put方法中的代码块,get无需加锁。当put元素时,会先使用CAS去插入元素,如果CAS失败才会加synchronized锁。特殊点,当数组为空put元素时直接进入CAS插入值。
5.Unsafe类,Java程序本来是注重安全的语言,程序员不可以直接操作系统内存资源,但是Unsafe类给程序员开了一个后门可直接操作内存,使得Java也拥有了像C指针一样操作内存空间的能力,增加了指针问题带来的风险,如操作堆外内存垃圾回收不及时造成的内存泄漏,compareAndSwap是Unsafe一个重要方法,也是CAS操作。Unsafe类使用单例模式,通过getUnsafe获取静态实例。