1700451077
1700451078
}
1700451079
1700451080
}).start();
1700451081
1700451082
}
1700451083
1700451084
}
1700451085
1700451086
读者可以执行一下,会发现线程名称Thread-0、Thread-1、Thread-2会逐渐输出,也就是一个线程在执行时,其他线程就处于等待状态。注意,这里三个线程运行的实例对象是同一个类(都是Client$1类的实例)。
1700451087
1700451088
那除了这一点不同之外,显式锁和内部锁还有什么不同呢?还有以下4点不同:
1700451089
1700451090
(1)Lock支持更细粒度的锁控制
1700451091
1700451092
假设读写锁分离,写操作时不允许有读写操作存在,而读操作时读写可以并发执行,这一点内部锁就很难实现。显式锁的示例代码如下:
1700451093
1700451094
class Foo{
1700451095
1700451096
//可重入的读写锁
1700451097
1700451098
private final ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
1700451099
1700451100
//读锁
1700451101
1700451102
private final Lock r=rwl.readLock();
1700451103
1700451104
//写锁
1700451105
1700451106
private final Lock w=rwl.writeLock();
1700451107
1700451108
//多操作,可并发执行
1700451109
1700451110
public void read(){
1700451111
1700451112
try{
1700451113
1700451114
r.lock();
1700451115
1700451116
Thread.sleep(1000);
1700451117
1700451118
System.out.println(“read……”);
1700451119
1700451120
}catch(InterruptedException e){
1700451121
1700451122
e.printStackTrace();
1700451123
1700451124
}finally{
1700451125
1700451126
r.unlock();
[
上一页 ]
[ :1.700451077e+09 ]
[
下一页 ]