1、描述Synchronized和reentrantlock的底层实现和重入的底层原理
2、描述锁的四种状态和升级过程
3、CAS是什么及ABA问题如何解决
4、请谈一下AQS,为什么AQS的底层是CAS + volatile
5、DCL单例为什么要加volatile
6、聊聊你对as-if-serial和happens-before语义的理解
7、ThreadLocal中如何解决内存泄漏问题
8、请描述下锁的分类以及JDK中的应用
9、自旋锁一定比重量级锁效率高吗?打开偏向锁是否效率会一定提高
(1)问题1
自旋锁和重量级锁(如Java中的synchronized)在效率上并没有绝对的优劣之分,它们各自适用于不同的场景。
-
自旋锁(Spinlock)是一种专门为防止多处理器并发而设计的锁机制。它的主要特点是,当尝试获取锁时,如果锁已经被其他执行单元持有,那么当前执行单元会进入“自旋”状态,即持续循环检查锁是否已被释放,而不是进入睡眠状态等待。这种机制在锁持有时间较短且线程切换开销较大的情况下比较有效,因为它避免了线程切换的开销。但是,如果锁竞争激烈,即锁的持有时间较长,那么自旋锁会导致CPU资源的浪费,因为执行单元会一直在循环等待,而无法进行其他工作。
-
重量级锁(如Java中的synchronized)则是一种更为传统的锁机制。它会在获取锁失败时,将当前线程挂起,等待锁的释放。虽然这种机制在锁竞争激烈时会导致线程切换的开销,但在锁持有时间较长的情况下,它可以避免CPU资源的浪费,因为挂起的线程不会占用CPU资源。
因此,自旋锁和重量级锁各有优缺点,选择哪种锁机制取决于具体的应用场景。如果锁竞争激烈且锁的持有时间较长,那么重量级锁可能更为合适;如果锁竞争不激烈且锁的持有时间较短,那么自旋锁可能更为高效。此外,还需要考虑线程切换的开销、CPU资源的利用率等因素。
总之,在选择锁机制时,需要根据具体的应用场景进行权衡和选择。