内容提要
• 用ReentrantLock控制业务层面的并发;
• 进一步理解可重入特性;
• 公平锁和非公平锁的使用场景;
• 读写锁的使用场景;
• 在面试中介绍锁的相关说辞;
ReentrantLock控制业务层面的并发
• 在账户类里,加入ReentrantLock锁 ;
• 登录,登出,存钱和取钱等方法上,无需加synchronized关键字;
ReentrantLock控制业务层面的并发
• 登录操作前,先锁账户,登出后,释放锁
• acc是AccountWithLock的实例
可重入锁
• 也叫可递归锁, synchronized和ReentrantLock ;
• 同一个线程再次进入同步代码时,可以使用自己已获取到的锁;
• 同一线程多次获取同一把锁时,防止死锁发生 ;
• 结合场景说明:比如某数据库的操作的线程需要多次调用被锁管理 的“获取数据库连接”的方法,如使用可重入锁就能避免死锁。反之,在第二次调用“获取数据库连接”方法时,就有可能被锁住。
公平锁和非公平锁
• 公平锁会维护一个等待队列,多个在阻塞状态等待的线程会被插入 该等待队列,在调度时是按它们所发请求的时间顺序获取锁;
• 未必需要保证先来先服务,非公平锁会有更多的机会去抢占锁;
• 创建可重入锁时,可通过调用带布尔类型参数的构造函数来指定 该锁是否是公平锁。ReentrantLock(boolean fair);
• 非公平锁性能高于公平锁,当前线程不是队列的第一个就无法获 取锁,从而增加了线程切换次数 ;
• 如线程占用(处理)时间要远长于线程等待,那用非公平锁其实效率 并不明显,但是用公平锁会给业务增强很多的可控制性;
读写锁
• ReentrantReadWriteLock对象会使用两把锁来管理临界 资源,一个是读锁,另一个是写锁
• 某线程获得了资源的“读锁“, 其它读操作可以并发, 但写操作的线程会被阻塞。
• 某线程获得了某资源的“写锁“,其它任何企图获得该资源 “读锁“和“写锁“的线程都将被阻塞。
• 如果读操作的数量要远超过写操作时,那么更可以用读写锁来 让读操作可以并发执行,从而提升性能。
总结
1. 通过Lock控制业务层面并发的方式
2. 可重入锁的表现形式
3. 公平锁的使用场景
4. 读写锁的使用场景