ReentrantReadWriteLock特性テスト
4220 ワード
package com.zhengweihao.test.concurrent.readwritelock;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import org.junit.Test;
public class ReadWriteLockTest {
private int runOver = 0;
private static final ExecutorService pool = Executors
.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private static final ReadLock readLock = rwl.readLock();
private static final WriteLock writeLock = rwl.writeLock();
/**
*
*/
@Test
public void testReadReadLock() {
runOver = 2;
final int sleepTime = 1000;
pool.execute(new Runnable() {
public void run() {
readLock.lock();
System.out.println("read1 locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("read1 unlocked " + nowString() + "..");
runOver--;
readLock.unlock();
}
});
pool.execute(new Runnable() {
public void run() {
readLock.lock();
System.out.println("read2 locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("read2 unlocked " + nowString() + "..");
runOver--;
readLock.unlock();
}
});
while (runOver > 0) {
sleep(sleepTime);
}
}
/**
*
*/
@Test
public void testReadWriteLock() {
runOver = 2;
final int sleepTime = 1000;
pool.execute(new Runnable() {
public void run() {
readLock.lock();
System.out.println("read locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("read unlocked " + nowString() + "..");
runOver--;
readLock.unlock();
}
});
pool.execute(new Runnable() {
public void run() {
writeLock.lock();
System.out.println("write locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("write unlocked " + nowString() + "..");
runOver--;
writeLock.unlock();
}
});
while (runOver > 0) {
sleep(sleepTime);
}
}
/**
*
*/
@Test
public void testWriteReadLock() {
runOver = 2;
final int sleepTime = 1000;
pool.execute(new Runnable() {
public void run() {
writeLock.lock();
System.out.println("write locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("write unlocked " + nowString() + "..");
runOver--;
writeLock.unlock();
}
});
pool.execute(new Runnable() {
public void run() {
readLock.lock();
System.out.println("read locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("read unlocked " + nowString() + "..");
runOver--;
readLock.unlock();
}
});
while (runOver > 0) {
sleep(sleepTime);
}
}
/**
*
*/
@Test
public void testWriteWriteLock() {
runOver = 2;
final int sleepTime = 1000;
pool.execute(new Runnable() {
public void run() {
writeLock.lock();
System.out.println("write1 locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("write1 unlocked " + nowString() + "..");
runOver--;
writeLock.unlock();
}
});
pool.execute(new Runnable() {
public void run() {
writeLock.lock();
System.out.println("write2 locked " + nowString() + "..");
sleep(sleepTime);
System.out.println("write2 unlocked " + nowString() + "..");
runOver--;
writeLock.unlock();
}
});
while (runOver > 0) {
sleep(sleepTime);
}
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private String nowString() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
return sdf.format(date);
}
}