Gre*_*reg 6 java locking thread-safety
一个锁总是后跟一个try/finally块,为什么?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么有这个try/finally块而不是简单地编写代码如下:
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();
}
Run Code Online (Sandbox Code Playgroud)
jdm*_*hal 10
因为try/finally块是保证一段代码在另一段完成后执行的唯一方法.
你问为什么不这样做:
public void function1(){
read.lock();
this.getSharedInt();
read.unlock();
}
Run Code Online (Sandbox Code Playgroud)
this.getSharedInt()抛出异常会发生什么?然后你的read.unlock()行将不会执行,导致程序死锁.当然,它可能100%经过认证,现在不会抛出异常,但是当您重构将共享int存储在文件或数据库中时会发生什么?
最后,不要忘记try/finally还会考虑错误,即使函数保证不抛出任何异常,运行时几乎可以在程序中的任何行抛出错误.
请注意,此代码也可以,但它会吞下异常.finally相反,使用允许异常正常传播,同时在所有条件下仍然可以解锁.
public void function2(){
read.lock();
try {
this.getSharedInt();
} catch(Throwable t) {}
read.unlock();
}
Run Code Online (Sandbox Code Playgroud)
这样就不会发生这样的事情:
private static ReentrantReadWriteLock readWriteLockBitmap = new ReentrantReadWriteLock();
private static Lock read = readWriteLockBitmap.readLock();
private static Lock write = readWriteLockBitmap.writeLock();
private static int shared = 0;
public static void function1() {
read.lock();
somethingThatMightThrowAnException();
read.unlock();
}
private static void somethingThatMightThrowAnException() {
throw new RuntimeException("I'm a bad man.");
}
public static void function2() {
write.lock();
//modify shared int
write.unlock();
}
public static void main(String[] args) {
try {
function1();
} catch (Exception e) {
System.out.println("Got an exception, but so what?");
}
function2();
}
Run Code Online (Sandbox Code Playgroud)