import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TestReentrantReadWriteLock extends Thread {
private ReentrantReadWriteLock readWriteLock;
private ArrayList<Integer> aList;
private String name;
public TestReentrantReadWriteLock(ReentrantReadWriteLock readWriteLock, ArrayList<Integer> aList, String name) {
super(name);
this.readWriteLock = readWriteLock;
this.aList = aList;
this.name = name;
}
@Override
public void run() {
super.run();
if (name.startsWith("Read")) {
readWriteLock.readLock().lock();
try {
for (int i = 0; i < 3; i++) {
System.out.printf(Thread.currentThread().getName() + " red: [%d];\n", aList.get(0));
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();
}
}
if (name.startsWith("Write")) {
readWriteLock.writeLock().lock();
try {
for (int i = 0; i < 3; i++) {
Random random = new Random();
int value = random.nextInt(100);
aList.set(0, value);
System.out.println(Thread.currentThread().getName() + " wrote: " + value);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();
}
}
}
public static void main(String[] args) {
ArrayList<Integer> aList = new ArrayList<>();
aList.add(0);
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
TestReentrantReadWriteLock r1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read1");
TestReentrantReadWriteLock r2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Read2");
TestReentrantReadWriteLock w1 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write1");
TestReentrantReadWriteLock w2 = new TestReentrantReadWriteLock(readWriteLock, aList, "Write2");
r1.start();
r2.start();
w1.start();
w2.start();
}
}
輸出
Read1 red: [0];
Read2 red: [0];
Read2 red: [0];
Read1 red: [0];
Read2 red: [0];
Read1 red: [0];
Write1 wrote: 58
Write1 wrote: 63
Write1 wrote: 64
Write2 wrote: 23
Write2 wrote: 13
Write2 wrote: 70
可見,確實是讀鎖是併發的,交叉地在執行;寫鎖是同步的,串行化地在執行。然後讀鎖和寫鎖是互斥的,在同一時間,要麼讀,要麼寫,不能一邊寫一邊讀。