Java并发包提供的加锁模式分为共享锁和独占锁。
独占锁
独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。独占锁是一种悲观保守的加锁策略,它避免了读/读冲突,如果某个只读线程获取锁,则其他读线程都只能等待,这种情况下就限制了不必要的并发性,因为读操作并不会影响数据的一致性。
共享锁
共享锁则允许多个线程同时获取锁,并发访问共享资源,如:ReadWriteLock。共享锁则是一种乐观锁,它放款了加锁策略,允许多个执行读操作的线程同时访问共享资源。
1.AQS的内部类Node定义了两个常量SHARED和EXCLUSIVE,它们分别标识AQS队列中等待线程的锁获取模式。
2.Java的并发包中提供了ReadWriteLock,读-写锁。它允许一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行。