比如如下代码,降级了并没有并发执行啊?
public void put(Object data){
rwl.writeLock().lock();
rwl.readLock().lock();
System.out.println(Thread.currentThread().getName() + " be ready to write data!");
try {
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data = data;
System.out.println(Thread.currentThread().getName() + " have write data: " + data);
rwl.readLock().unlock();
rwl.writeLock().unlock();
}
输出:
Thread-0 be ready to write data!
Thread-0 have write data: 1103
Thread-2 be ready to write data!
Thread-2 have write data: 4531
Thread-1 be ready to write data!
Thread-1 have write data: 2188
也并没有并发执行啊
是写的线程用writelock,读的线程用readlock
在一边读一边写的情况下提高性能。
这里又原理的分析:https://www.jianshu.com/p/9f98299a17a5
你这里3个线程都是要写数据 怎么可能会并发执行,Thread-0 调用put的时候占用了write锁,Thread-1和Thread-2都被挡在外面了;锁降级的意义是当前线程由write降为read,其他只需要read锁的线程可以去获取read锁,达到并发读的目的。
是先释放写锁,当前线程把住读锁,可以读已更新的数据,所有线程都可以并发读,但是其他线程不能写,这样就能让当前线程读到之前改变的结果。如果像你这样先释放读,再释放写,并发读意义就没了