962*_*001 16 java locking java.util.concurrent
之间有什么区别:
private Lock lock = new ReentrantLock(true);
public void getIn (int direction) throws InterruptedException {
lock.lock();
try {
...
Run Code Online (Sandbox Code Playgroud)
和
...
public void getIn (int direction) throws InterruptedException {
try {
lock.lock();
...
Run Code Online (Sandbox Code Playgroud)
编译顺利,程序也可以工作(我的意思是相同的输出)
我应该把lock.lock(); 在尝试之前或之后?...
谢谢你的帮助
thk*_*ala 16
假设它lock是a ReentrantLock,那么它没有真正的区别,因为lock()不会抛出任何已检查的异常.
但是,Java文档lock()不在示例中的try块之外ReentrantLock.原因是未经检查的异常lock()不应导致unlock()错误地被调用.在lock()所有事情中存在未经检查的异常时,正确性是否是一个问题,这是另一个完全的讨论.
一般来说,保持像try块一样的细粒度是一种很好的编码实践.
如果是1号案例,finally你可以说unlock().在No2的情况下你需要检查你之前是否持有锁unlock(),否则你可以得到IllegalMonitorStateException
try 语句还包含:
} finally {
lock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果放在lock.lock()之后try,抛出的异常 lock.lock()会导致
lock.unlock(),这是错误的,因为没有获得锁,解锁会导致另一个异常。所以第一个变体是正确的。要处理抛出的异常,lock.lock()您必须使用另一个 try 语句。
在第一种情况下:如果lock.lock()throws InterruptedException,getIn将管理它。但对于任何其他异常,它都会抛出一个getIn不处理的异常:运行时异常
在第二种情况下:除了 之外InterruptedException,该try-catch块还执行一些异常处理,此处未显示。这应该会引发较少的异常,因为内部块也捕获了一些异常。
整体运行取决于lock.lock()抛出什么异常?
| 归档时间: |
|
| 查看次数: |
4061 次 |
| 最近记录: |