今天学习了解决线程安全问题的方式三:Lock锁,我自己有以下几个疑问:
- 为啥锁和解锁操作要放在try--finally结构中?
- 为啥锁操作lock()不能放在thy内部?
这是正常步骤
// 1.创建锁对象
private ReentrantLock lock = new ReentrantLock();
// 2.在同步代码块前调用锁定方法lock(),获得锁
lock.lock();
try{
// 同步代码块
}finally{
// 3.在同步代码块执行完成后调用解锁方法unlock()释放锁
lock.unlock();
}
问题一:为啥锁和解锁操作要放在try--finally结构中?
我是这么觉得的:我们获得锁之后,假如在同步代码块中发生了异常的话,就会导致解锁unlock()操作无法执行,这样可能会导致死锁,而放在try--finally结构中,就保证了解锁操作一定会执行,这样就避免了死锁问题。
问题二:为啥锁操作lock()不能放在thy内部?
官方的操作是这样的:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html
但是我觉得将lock.lock();放在try内部也是可以的:
// 1.创建锁对象
private ReentrantLock lock = new ReentrantLock();
try{
// 2.在同步代码块前调用锁定方法lock(),获得锁
lock.lock();
// 同步代码块
}finally{
// 3.在同步代码块执行完成后调用解锁方法unlock()释放锁
lock.unlock();
}
很多文章说lock.lock();不能放在放在try内部,我觉得可以放,但是lock.lock();操作必须放在try内部的第一行,你获得锁了,就算同步代码块发生异常了,也会在finally中解锁,所以还是正常的。
欢迎大家一起来讨论!