锁降级的时候这个线程同时持有读锁和写锁,是否和要么多读要么一写这句话有冲突呢?
如果在降级的时候不释放写锁,我发现其他线程想要获取读锁还是获取不到呢老师,也就是说即使降级成功后,也得等释放了写锁其他读的线程才能得到读锁,大家还是不能跟它一起读取,除非先释放掉写锁。实验代码如下
public class Upgrading {
private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(false);
private static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
private static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
private static void readUpgrading(){
readLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"得到了读锁,正在读取");
Thread.sleep(1000);
System.out.println("升级会带来阻塞");
writeLock.lock(); //升级为写锁
System.out.println(Thread.currentThread().getName() + "获取到了写锁,升级成功");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName()+"释放读锁");
readLock.unlock();
}
}
private static void writeDowngrading(){
writeLock.lock();
try {
System.out.println(Thread.currentThread().getName()+"得到了写锁,正在写入");
Thread.sleep(1000);
readLock.lock();
System.out.println("在不释放写锁的情况下,直接获取读锁,成功降级");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(Thread.currentThread().getName()+"释放读锁");
readLock.unlock();
System.out.println(Thread.currentThread().getName()+"释放写锁");
//writeLock.unlock(); //这里选择不释放写锁
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("先演示降级是可以的");
Thread thread1 = new Thread(()->writeDowngrading(),"Thread1");
thread1.start();
// thread1.join();
// System.out.println("----------------");
//
// System.out.println("演示升级是不行的");
// Thread thread2 = new Thread(()->readUpgrading(),"Thread2");
// thread2.start();
Thread thread3 = new Thread(()->readUpgrading(),"Thread3");
thread3.start();
}
}
控制台输出