Java常见的锁总结(可重入锁、乐观锁、悲观锁、公平锁、非公平锁、自旋锁、偏向锁、分段锁等) - 那些年的代码 - 博客园Java常见的锁总结Java常见的锁总结锁是一种多线程同步访问技术。我们常听到的关于锁的词有:排它锁、共享锁、可重入锁、乐观锁、悲观锁、公平锁、非公平锁、自旋锁、偏向锁、轻量级锁、重量级锁、分段锁等。

根据重入和排他分析:共享锁,可重入锁,排他锁

共享锁:线程可以同时获取锁,ReentrantReadWriteLock对于读锁是共享的,在读多写少的情况下使用共享锁会特别高效。

重入锁:线程获取锁后可以重复执行锁区域,java提供的锁都是可重入锁,不可重入锁非常容易导致思索。

排他锁:多线程不可同时获取的锁,与共享锁对立。与重复锁不矛盾可以是并存属性。

根据获取锁的方式区分:

乐观锁,悲观锁

乐观锁:其实是一种采用具有原子性的CAS非加锁机制,保证当前现场原子性执行。

悲观锁:直接加锁进行线程隔离。synchronized、ReentrantLock,ReentrantReadWriteLock的写锁都属于悲观锁,适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。

根据获取锁时是否参与排队:

公平锁,非公平锁

公平锁:线程试图获取锁时,先按照尝试获取锁的时间顺序排队。

非公平锁:线程试图获取锁时,如果当前没有线程占用,则跟排队获取锁的线程一起竞争而无需按顺序排队,如果竞选失败,依然继续排队,非公平锁比较搞笑,因为公平锁需要先线程唤起。

根据锁的状态划分

偏向锁,轻量级锁,重量级锁

关于锁:

        AQS(AbstractQueuedSynchronizer 抽象队列式的同步器)是一种多线程访问共享资源的同步器框架,需求同步类实现都依赖他,如常用的ReentrantLock/Semaphore/CountDownLatch...

        CAS(Compare and Swap)比较并交换,是乐观锁技术,底层是java的sun.misc.Unsafe类,他可以直接操作内存。

        获取锁和释放锁都是有资源消耗的,线程的阻塞和唤起也是要消耗资源的,如果要阻塞或者唤醒一个线程就需要操作系统介入,需要在用户态和核心态之间切换,这种切换会消耗大量的系统资源,因为用户态和内核态都是不同过的内存空间,

synchronized 是jvm层次实现的,在高并发的情况下性能不如代码实现的Lock高效,但是synchronized一直在优化,现在已经几乎没有差距了,是官方推荐的方式。