Java 标准库提供了 ReentrantReadWriteLock 类, 实现了读写锁。ReentrantReadWriteLock.ReadLock 类表示一个读锁, ReentrantReadWriteLock.WriteLock 类表示一个写锁。这两个对象提供了 lock / unlock 方法进行加锁解锁。读写锁就是把读操作和写操作区分对待:
如果获取锁失败,立即再尝试获取锁,无限循环,直到获取到锁为止。第一次获取锁失败,第二次的尝试会在极短的时间内到来,一旦锁被其他线程释放,就能第一时间获取到锁。自旋锁是典型的轻量级锁,它没有放弃 CPU,不涉及线程阻塞和调度。但是如果锁被其他线程持有时间较长的话,就会浪费 CPU 资源。当CAS操作时,比较操作失败后就是执行的自旋等待。
当线程获取了锁资源后,再次尝试去获取时,直接引用计数加一,不用等待自身放弃,避免了死锁。ReentrantLock、synchronized 锁都是可重入锁。
偏向锁是JDK6时加入的一种锁优化机制: 在无竞争的情况下把整个同步都消除掉,连CAS操作都不去做了。这个锁会偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁一直没有被其他的线程获取,则持有偏向锁的线程将永远不需要再进行同步。持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作(例如加锁、解锁及对Mark Word的更新操作等)。
同步锁表示并发执行的多个线程,在同一时间内只允许一个线程访问共享数据。在java中 synchronized 锁就是同步锁。synchronized 锁会根据线程竞争情况进行升级,升级过程为:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。