JUC中的锁

内部锁:

     内部锁就是synchronised,由jvm内部实现管理
重入锁:
     它可以中断、可定时
     重入锁(ReentrantLock),提供公平和非公平两种锁,公平锁保证先进先出,但是有一定的性能省耗
     它是一种互斥的实现,一次只能一个线程拿到锁;
     如果一个线程试图获取一个已经由它自己持有的锁,那么这个请求会成功,“重入”意味着获取锁的粒度是线程,而不是调用者。

读写锁:
     读写锁(ReadWriteLock)是读写分离的锁,适用场景是读多写少,读锁可以同时有多个线程获得,获得读锁的所有线程的读操作是并行的。
     但读和写的线程是串行的,也就是说写的时候,获得读锁的线程都需要等待。
信号量:
     信号量(Semaphore)是对锁的扩展,它可以限定对某一具体资源的最大可访问线程数。
     如Pool的实现,可以最大连接数,每个连接相当于一个许可,如果超过最大连接数,请让申请连接的线程等待。

锁条件对象:
     锁条件对象(Condition)是通过锁实例的newCondition()方法创建的,用于实现业务层的一些复杂逻辑
     如在Queue的实现中,就是创建了一个非空(notEmpty)和一非满(notFull)的条件对象来实现,当队列满时让生产者线程等待,在队列空时
     让消费者线程等待。

自旋锁:
     自旋锁(SpinningLock)是JVM对锁优化的手段,线程被挂取和切换的资源消耗是很高的,所以JVM可以在没有取得锁时,不被挂起,而去执行
一个空循环(即所谓的自旋),在若干个自旋如果获得了锁,就继续执行,如果还未能获得锁才会被挂起。
     可以通过-XX:+UseSpinning参数来开启自旋锁,通过-XX:PreBlockSping参数来设置自旋锁的等待次数。

锁消除:
     锁消除是JVM在即时编译时,通过到上下文的扫描,去除不可能存在共享资源竞争的锁,从而节省无竟义的请求锁时间。
     如:在开发中开发人员必须会用到大量的StringBuffer和Vector等。他们很有可能是方法内部的,不存在资源竞争的问题。
     可以常过设置JVM参数逃逸分析(-XX:+DoEscapeAnalysis)和锁清除(-XX:+EliminateLocks)开启,但必须工作在-server模式下。

同步倒数计数器:
     同步倒数计数器(CountDownLatch)是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。


栅栏:
     栅栏(CyclicBarrier),一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
原文地址:https://www.cnblogs.com/zengxianxi/p/3607908.html