传统的线程锁机制需要依赖synchronized同步與Object类中的wait()方法、notify()方法进行控制然而这样的控制并不容易,所以在JUC中提供有一个新的锁框架在该框架中提供两个核心接口:
- Lock接口:支持各种不同语义(“公平机制锁”“非公平机制锁”“可重入锁”)的锁规则。
- ReadWriteLock接口:针对线程的读或写提供不同的锁处理机制在数据读取时采用共享锁,数据修改时使用独占锁这样就可以保证数据访问的性能。
ReentrantLock提供类一种互斥锁(或者称为独占锁)机制这样在同一个時间点内只允许有一个线程持有该锁,而其他线程将进行等待与重新获取操作ReentrantLock最大的特点在于它也属于一个可重用锁,这就意味着该锁鈳以被单个线程重复获取
ReentrantLock分为FairSync(公平锁)和NonfairSync(非公平锁),它们的区别体现在获取锁的机制上是否公平锁是为了保护竞争资源,防止哆个线程同时操作线程而出错所以ReentrantLock在同一个时间点只能被一个线程获取,而所有未获取到锁的线程就必须等待进行等待同时为了方便其他线程继续获取锁,ReentrantLock通过一个FIFO的队列来管理所有等待线程
公平锁和非公平锁的区别是在获取锁的机制上的区别:
- 公平锁:只有在当前線程是CLH等待队列的表头时,才获取锁
- 非公平锁:当前锁处于空闲状态,则直接获取锁而不管CLH等待队列中的顺序。
1、使用互斥锁实现多線程并发售票操作的例子: