这段demo里就算我释放了写锁,读线程还是很大几率会被堵塞住,只是偶尔会得到执行权。锁降级不是当前线程获得写锁然后获得读锁堵塞住其他写线程再释放写锁吗,那么这段代码里写线程释放锁之后读线程应该立刻得到执行权才对。我这个问题是代码问题还是我的理解有错误呢。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteTest {
public static void main(String[] args) {
ReadWriteFac fac = new ReadWriteFac();
Thread thread = new Thread();
for (int i = 0; i < 5; i++) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
fac.get();
}
}
}, "读线程" + i);
t1.setPriority(10);
t1.start();
}
for (int i = 0; i < 10; i++) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
fac.plus();
}
}, "写线程" + i);
t1.setPriority(1);
t1.start();
}
}
}
class ReadWriteFac {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private volatile int i = 0;
Lock r = lock.readLock();
Lock w = lock.writeLock();
public void plus() {
w.lock();
System.out.println(Thread.currentThread().getName() + "---获取了写锁");
try {
i++;
System.out.println(Thread.currentThread().getName() + "---将i修改为" + i);
r.lock();
} finally {
w.unlock();//释放写锁 因为上面读锁未被释放 其他写线程无法进入但读线程可以继续
System.out.println(Thread.currentThread().getName() + "---释放了写锁\r\n\r\n");
try{
TimeUnit.SECONDS.sleep(3);
}catch(Exception e){
}
r.unlock();//释放读锁
System.out.println(Thread.currentThread().getName() + "---释放了读锁");
}
}
public int get() {
r.lock();
try {
if(i!=10){
System.out.println(Thread.currentThread().getName() + "获取到了" + i);
}
return i;
}finally {
r.unlock();
}
}
}