打字猴:1.700451051e+09
1700451051
1700451052 new Thread(new Runnable(){
1700451053
1700451054 @Override
1700451055
1700451056 public void run(){
1700451057
1700451058 try{
1700451059
1700451060 lock.lock();
1700451061
1700451062 //休眠2秒钟
1700451063
1700451064 Thread.sleep(2000);
1700451065
1700451066 System.out.println(Thread.currentThread().getName());
1700451067
1700451068 }catch(InterruptedException e){
1700451069
1700451070 e.printStackTrace();
1700451071
1700451072 }finally{
1700451073
1700451074 lock.unlock();
1700451075
1700451076 }
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 //读锁
[ 上一页 ]  [ :1.700451051e+09 ]  [ 下一页 ]