1.公平锁与非公平锁?
公平锁:遵循FIFO(先进先出)的原则,先到的线程优先获取资源
非公平锁:后到的线程有可能先获取到资源
ReentrantLock,ReentrantReadWriteLock 默认构造都是非公平锁,非公平锁的优点在于吞吐量比公平锁大。synchronized也是非公平锁
2.可重入锁(又名递归锁)?
指的是同一线程在外层函数获取锁之后,内层递归函数仍然能获取该锁。在同一线程外层方法获取锁时,进入内层方法会自动回去到锁
ReentrantLock就是一个典型的可重入锁
3.自旋锁(spinLock)?
尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
4.手写一个自旋锁?
public class SpinLockDemo { private AtomicReference<Thread> atomicReference = new AtomicReference(); public void lock() { Thread thread = Thread.currentThread(); while (!atomicReference.compareAndSet(null, thread)) { } System.out.println(Thread.currentThread().getName()+"--线程invoke lock"); } public void unlock() { Thread thread = Thread.currentThread(); atomicReference.compareAndSet(thread, null); System.out.println(Thread.currentThread().getName()+"--线程释放锁"); } }
5.独占锁 (写锁) /共享锁 (读锁) /互斥锁?
独占锁:该锁一次只能被一个线程获取
共享锁:该锁可以被多个线程持有