您的位置:首页 > 编程语言 > Java开发

Thread详解15:ReentrantReadWriteLock

2016-03-31 17:25 543 查看


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


可见,确实是读锁是并发的,交叉地在执行;写锁是同步的,串行化地在执行。然后读锁和写锁是互斥的,在同一时间,要么读,要么写,不能一边写一边读。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息