定义:能够允许多个读操作或者一个写操作,两者不能同时进行
使用
package net.jcip.examples;
import java.util.*;
import java.util.concurrent.locks.*;
/**
* ReadWriteMap
* <p/>
* Wrapping a Map with a read-write lock
*
* @author Brian Goetz and Tim Peierls
*/
public class ReadWriteMap <K,V> {
private final Map<K, V> map;
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();
public ReadWriteMap(Map<K, V> map) {
this.map = map;
}
public V put(K key, V value) {
w.lock();
try {
return map.put(key, value);
} finally {
w.unlock();
}
}
public V remove(Object key) {
w.lock();
try {
return map.remove(key);
} finally {
w.unlock();
}
}
public void putAll(Map<? extends K, ? extends V> m) {
w.lock();
try {
map.putAll(m);
} finally {
w.unlock();
}
}
public void clear() {
w.lock();
try {
map.clear();
} finally {
w.unlock();
}
}
public V get(Object key) {
r.lock();
try {
return map.get(key);
} finally {
r.unlock();
}
}
public int size() {
r.lock();
try {
return map.size();
} finally {
r.unlock();
}
}
public boolean isEmpty() {
r.lock();
try {
return map.isEmpty();
} finally {
r.unlock();
}
}
public boolean containsKey(Object key) {
r.lock();
try {
return map.containsKey(key);
} finally {
r.unlock();
}
}
public boolean containsValue(Object value) {
r.lock();
try {
return map.containsValue(value);
} finally {
r.unlock();
}
}
}
自己实现的读写锁
读写锁实现
package ReadWriteLock.Sample;
public final class ReadWriteLock {
private int readingReaders = 0; //
private int waitingWriters = 0; //
private int writingWriters = 0; //
private boolean preferWriter = true; //
public synchronized void readLock() throws InterruptedException {
while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) {
wait();
}
readingReaders++; //
}
public synchronized void readUnlock() {
readingReaders--; //
preferWriter = true;
notifyAll();
}
public synchronized void writeLock() throws InterruptedException {
waitingWriters++; //
try {
while (readingReaders > 0 || writingWriters > 0) {
wait();
}
} finally {
waitingWriters--; //
}
writingWriters++; //
}
public synchronized void writeUnlock() {
writingWriters--; //
preferWriter = false;
notifyAll();
}
}
使用了读写锁保护的数据
package ReadWriteLock.Sample;
public class Data {
private final char[] buffer;
private final ReadWriteLock lock = new ReadWriteLock();
public Data(int size) {
this.buffer = new char[size];
for (int i = 0; i < buffer.length; i++) {
buffer[i] = '*';
}
}
public char[] read() throws InterruptedException {
lock.readLock();
try {
return doRead();
} finally {
lock.readUnlock();
}
}
public void write(char c) throws InterruptedException {
lock.writeLock();
try {
doWrite(c);
} finally {
lock.writeUnlock();
}
}
private char[] doRead() {
char[] newbuf = new char[buffer.length];
for (int i = 0; i < buffer.length; i++) {
newbuf[i] = buffer[i];
}
slowly();
return newbuf;
}
private void doWrite(char c) {
for (int i = 0; i < buffer.length; i++) {
buffer[i] = c;
slowly();
}
}
private void slowly() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
}
读线程
package ReadWriteLock.Sample;
public class ReaderThread extends Thread {
private final Data data;
public ReaderThread(Data data) {
this.data = data;
}
public void run() {
try {
while (true) {
char[] readbuf = data.read();
System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf));
}
} catch (InterruptedException e) {
}
}
}
写线程
package ReadWriteLock.Sample;
import java.util.Random;
public class WriterThread extends Thread {
private static final Random random = new Random();
private final Data data;
private final String filler;
private int index = 0;
public WriterThread(Data data, String filler) {
this.data = data;
this.filler = filler;
}
public void run() {
try {
while (true) {
char c = nextchar();
data.write(c);
Thread.sleep(random.nextInt(3000));
}
} catch (InterruptedException e) {
}
}
private char nextchar() {
char c = filler.charAt(index);
index++;
if (index >= filler.length()) {
index = 0;
}
return c;
}
}
调用
package ReadWriteLock.Sample;
public class Main {
public static void main(String[] args) {
Data data = new Data(10);
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new ReaderThread(data).start();
new WriterThread(data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ").start();
new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start();
}
}
使用了的结果
Thread-0 reads **********
Thread-4 reads **********
Thread-5 reads **********
Thread-3 reads **********
Thread-2 reads **********
Thread-1 reads **********
Thread-0 reads AAAAAAAAAA
Thread-4 reads AAAAAAAAAA
Thread-5 reads AAAAAAAAAA
Thread-2 reads AAAAAAAAAA
Thread-3 reads AAAAAAAAAA
Thread-1 reads AAAAAAAAAA
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-3 reads BBBBBBBBBB
Thread-5 reads BBBBBBBBBB
Thread-4 reads BBBBBBBBBB
Thread-0 reads BBBBBBBBBB
Thread-1 reads BBBBBBBBBB
Thread-2 reads BBBBBBBBBB
Thread-2 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-5 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-4 reads bbbbbbbbbb
Thread-5 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-5 reads CCCCCCCCCC
Thread-1 reads CCCCCCCCCC
Thread-3 reads CCCCCCCCCC
Thread-4 reads CCCCCCCCCC
Thread-0 reads CCCCCCCCCC
Thread-2 reads CCCCCCCCCC
Thread-3 reads cccccccccc
Thread-0 reads cccccccccc
Thread-5 reads cccccccccc
Thread-1 reads cccccccccc
Thread-4 reads cccccccccc
Thread-2 reads cccccccccc
Thread-5 reads cccccccccc
Thread-3 reads cccccccccc
Thread-1 reads cccccccccc
Thread-0 reads cccccccccc
Thread-2 reads cccccccccc
Thread-4 reads cccccccccc
Thread-5 reads cccccccccc
Thread-3 reads cccccccccc
Thread-1 reads cccccccccc
Thread-0 reads cccccccccc
Thread-4 reads cccccccccc
Thread-2 reads cccccccccc
Thread-0 reads cccccccccc
Thread-3 reads cccccccccc
Thread-1 reads cccccccccc
Thread-5 reads cccccccccc
Thread-4 reads cccccccccc
Thread-2 reads cccccccccc
Thread-5 reads cccccccccc
Thread-3 reads cccccccccc
Thread-1 reads cccccccccc
Thread-0 reads cccccccccc
Thread-4 reads cccccccccc
Thread-2 reads cccccccccc
Thread-5 reads cccccccccc
Thread-0 reads cccccccccc
Thread-3 reads cccccccccc
Thread-1 reads cccccccccc
Thread-4 reads cccccccccc
Thread-2 reads cccccccccc
Thread-5 reads cccccccccc
Thread-0 reads cccccccccc
Thread-3 reads cccccccccc
Thread-2 reads cccccccccc
Thread-4 reads cccccccccc
Thread-1 reads cccccccccc
Thread-5 reads cccccccccc
Thread-2 reads eeeeeeeeee
Thread-1 reads eeeeeeeeee
Thread-4 reads eeeeeeeeee
Thread-3 reads eeeeeeeeee
Thread-5 reads eeeeeeeeee
Thread-0 reads eeeeeeeeee
Thread-2 reads eeeeeeeeee
Thread-4 reads eeeeeeeeee
Thread-1 reads eeeeeeeeee
Thread-3 reads eeeeeeeeee
Thread-5 reads eeeeeeeeee
Thread-0 reads eeeeeeeeee
Thread-4 reads eeeeeeeeee
Thread-3 reads eeeeeeeeee
Thread-1 reads eeeeeeee