读锁: 线程拿到读锁, 那么其他线程还可以拿读锁, 但是不能拿写锁
写锁: 线程拿到写锁, 那么其他线程既不能拿读锁, 也不能拿写锁
代码:
package read.write.lock;
import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLock {
public static void main(String[] args) throws InterruptedException {
final Queue3 q3 = new Queue3();
for(int i=0;i<3;i++){
new Thread(){
public void run() {
try {
while(true)
q3.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
for(int i=0;i<3;i++){
new Thread(){
public void run() {
try {
while(true)
q3.put(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
}
}
}
class Queue3 {
private Object data = null;//共享数据,只能一个线程写,可以多个线程读
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
public void get() throws InterruptedException { //读锁,其他线程只能读,不能写
rwl.readLock().lock();
System.out.println(Thread.currentThread().getName() + " begin to read data");
Thread.sleep((long)Math.random() * 1000);
System.out.println(Thread.currentThread().getName() + " read over, data is " + data);
rwl.readLock().unlock();
}
public void put(int data) throws InterruptedException { //写锁,不允许其他线程读或写
rwl.writeLock().lock();
System.out.println(Thread.currentThread().getName() + " begin to write data");
Thread.sleep((long)Math.random() * 1000);
this.data = data;
System.out.println(Thread.currentThread().getName() + " write over,data is " + data);
rwl.writeLock().unlock();
}
}
结果
Thread-0 begin to read data //读锁可以被多个线程同时拿到
Thread-2 begin to read data
Thread-1 begin to read data
Thread-0 read over, data is null
Thread-1 read over, data is null
Thread-2 read over, data is null
Thread-3 begin to write data //写锁拿到, 其他线程读写锁都拿不到
Thread-3 write over,data is 2285
Thread-4 begin to write data
Thread-4 write over,data is 6436
Thread-5 begin to write data
Thread-5 write over,data is 5082