java常见的锁实例
- 乐观锁/悲观锁
CAS乐观锁,synchronized悲观锁 - 独享锁/共享锁
synchronize是独享锁,ReadWriteLock的读锁是共享锁,写锁是独享锁 - 互斥锁/读写锁
互斥锁是ReentrantLock,读写锁就是ReadWriteLock - 可重入锁
ReentrantLock,synchronized - 公平锁/非公平锁
ReentrantLock通过构造函数决定是否为公平锁,而synchronized不是AQS机制的所以没办法成为公平锁 - 分段锁
主要是为了细化锁粒度,如ConcurrentHashMap的分段锁被称为Segment就是典型的分段锁,内部有个Entry数组,数组的每个元素又是一个链表,同时又是一个ReentrantLock - 偏向锁/轻量级锁/重量级锁
这三种锁是对于synchronized来说的,- 偏向锁是指一段同步代码一直被一个线程所访问,那个该线程就自动获取所,降低了获取锁的代价
- 轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会自旋尝试获取锁,不会阻塞,提高性能,但是同时也会浪费cpu
- 重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但是自旋不会一直自旋下去,当自旋一定次数的时候,还没获取到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会让他申请的线程进入阻塞状态,性能降低
- 在java中,自旋锁是指尝试获取锁的线程不会立即阻塞,而是采取循环的方式尝试获取锁,这样的好处是减少线程的上下文切换的消耗,但是缺点是循环会消耗cpu