readholdingwritelock.java
来自「SRI international 发布的OAA框架软件」· Java 代码 · 共 143 行
JAVA
143 行
import edu.emory.mathcs.backport.java.util.concurrent.locks.*;
public class ReadHoldingWriteLock {
public static void main(String[] args) throws Exception {
ReadHoldingWriteLock t = new ReadHoldingWriteLock();
t.testReadAfterWriteLock();
t.testReadHoldingWriteLock();
t.testReadHoldingWriteLock2();
// t.testReadHoldingWriteLockFair();
// t.testReadHoldingWriteLockFair2();
}
static final long SHORT_DELAY_MS = 50;
static final long MEDIUM_DELAY_MS = 200;
void assertTrue(boolean b) {
if (!b) throw new Error();
}
/**
* Readlocks succeed after a writing thread unlocks
*/
public void testReadAfterWriteLock() throws Exception {
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
Thread t1 = new Thread(new Runnable() {
public void run() {
lock.readLock().lock();
lock.readLock().unlock();
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
lock.readLock().lock();
lock.readLock().unlock();
}
});
t1.start();
t2.start();
Thread.sleep(SHORT_DELAY_MS);
lock.writeLock().unlock();
t1.join(MEDIUM_DELAY_MS);
t2.join(MEDIUM_DELAY_MS);
assertTrue(!t1.isAlive());
assertTrue(!t2.isAlive());
}
/**
* Read trylock succeeds if write locked by current thread
*/
public void testReadHoldingWriteLock()throws Exception {
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
assertTrue(lock.readLock().tryLock());
lock.readLock().unlock();
lock.writeLock().unlock();
}
/**
* Read lock succeeds if write locked by current thread even if
* other threads are waiting
*/
public void testReadHoldingWriteLock2() throws Exception{
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
Thread t1 = new Thread(new Runnable() {
public void run() {
lock.readLock().lock();
lock.readLock().unlock();
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
lock.readLock().lock();
lock.readLock().unlock();
}
});
t1.start();
t2.start();
lock.readLock().lock();
lock.readLock().unlock();
Thread.sleep(SHORT_DELAY_MS);
lock.readLock().lock();
lock.readLock().unlock();
lock.writeLock().unlock();
t1.join(MEDIUM_DELAY_MS);
t2.join(MEDIUM_DELAY_MS);
assertTrue(!t1.isAlive());
assertTrue(!t2.isAlive());
}
/**
* Fair Read trylock succeeds if write locked by current thread
*/
// public void testReadHoldingWriteLockFair() throws Exception{
// final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
// lock.writeLock().lock();
// assertTrue(lock.readLock().tryLock());
// lock.readLock().unlock();
// lock.writeLock().unlock();
// }
/**
* Fair Read lock succeeds if write locked by current thread even if
* other threads are waiting
*/
// public void testReadHoldingWriteLockFair2() throws Exception {
// final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
// lock.writeLock().lock();
// Thread t1 = new Thread(new Runnable() {
// public void run() {
// lock.readLock().lock();
// lock.readLock().unlock();
// }
// });
// Thread t2 = new Thread(new Runnable() {
// public void run() {
// lock.readLock().lock();
// lock.readLock().unlock();
// }
// });
//
// t1.start();
// t2.start();
// lock.readLock().lock();
// lock.readLock().unlock();
// Thread.sleep(SHORT_DELAY_MS);
// lock.readLock().lock();
// lock.readLock().unlock();
// lock.writeLock().unlock();
// t1.join(MEDIUM_DELAY_MS);
// t2.join(MEDIUM_DELAY_MS);
// assertTrue(!t1.isAlive());
// assertTrue(!t2.isAlive());
//
//
// }
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?