正确答案是A。synchronized是JVM内置的锁机制,自动获取和释放锁;而ReentrantLock是Java API层面提供的锁,需要手动获取和释放。ReentrantLock提供了更多功能,如公平锁、超时机制、可中断锁等。
正确答案是D。公平锁按照FIFO(先进先出)顺序分配锁,避免了线程饥饿问题;非公平锁允许新来的线程插队获取锁,可能导致某些线程长时间等待。但非公平锁的性能通常比公平锁更好。
正确答案是B。ReadWriteLock中,读锁是共享锁,多个线程可以同时持有读锁;写锁是排他锁,只能被一个线程持有,且与读锁互斥。这种设计在读多写少的场景下能显著提升性能。
正确答案是D。Condition接口提供了类似Object.wait()和notify()的功能,但更加灵活。一个Lock可以关联多个Condition,每个Condition可以有自己的等待队列,从而实现更精确的线程通信。
正确答案是D。StampedLock的乐观读锁不会阻塞写操作,读取时先获取一个stamp,读取完成后需要验证stamp是否有效。如果验证失败,说明期间有写操作,需要升级为悲观读锁重新读取。
正确答案是D。ReentrantLock和ReentrantReadWriteLock都支持重入,即同一个线程可以多次获取同一把锁。而StampedLock不支持重入,这是它的一个限制。
正确答案是C。StampedLock适合读多写少且对性能要求极高的场景,因为它的乐观读锁不会阻塞写操作,在这种场景下性能优于ReadWriteLock。但它不支持重入和Condition,使用复杂度较高。
正确答案是B。锁降级是指在持有写锁的情况下,在释放写锁之前先获取读锁,然后释放写锁,从而将写锁降级为读锁。这样可以保证数据的一致性,同时允许其他线程进行读操作。