内部锁: 内部锁就是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)。