gpt4 book ai didi

java - 线程 - 为什么必须在 try 和 finally 之后使用 Lock

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:39:40 25 4
gpt4 key购买 nike

Lock 后面总是跟着 try/finally block ,为什么?

ReentrantReadWriteLock readWriteLockBitmap = new ReentrantReadWriteLock();
Lock read = readWriteLockBitmap.readLock();
Lock write = readWriteLockBitmap.writeLock();
int shared = 0;

public void function1(){
read.lock();
try{
//reading shared int
}
finally{
read.unlock();
}
}

public void function 2(){
write.lock();
try{
//modify shared int
}
finally{
write.unlock();
}
}

为什么要有这个 try/finally block 而不是简单地编写如下代码:

ReentrantReadWriteLock readWriteLockBitmap = new ReentrantReadWriteLock();
Lock read = readWriteLockBitmap.readLock();
Lock write = readWriteLockBitmap.writeLock();
int shared = 0;

public void function1(){
read.lock();
//reading shared int
read.unlock();
}

public void function 2(){
write.lock();
//modify shared int
write.unlock();
}

最佳答案

因为 try/finally block 是保证一段代码在另一段代码完成后执行的唯一方法。

你问为什么不这样做:

public void function1(){
read.lock();
this.getSharedInt();
read.unlock();
}

this.getSharedInt() 抛出异常时会发生什么?那么你的read.unlock()行就不会被执行,造成程序死锁。当然,它可能 100% 证明现在不会抛出异常,但是当您重构以将共享 int 存储在文件或数据库中时会发生什么?

最后,不要忘记 try/finally 也考虑了错误,运行时几乎可以在程序的任何行抛出错误,即使该函数保证不会抛出任何异常也是如此。

请注意,此代码也可以工作,但它吞没了异常。使用 finally 可以让异常正常传播,同时在所有条件下仍然解锁。

public void function2(){
read.lock();
try {
this.getSharedInt();
} catch(Throwable t) {}
read.unlock();
}

关于java - 线程 - 为什么必须在 try 和 finally 之后使用 Lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com