1.ReentrantReadWriteLock会锁写锁,但是不会锁读锁
2.
如何获取写锁
ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
reentrantReadWriteLock.writeLock().lock();
reentrantReadWriteLock.writeLock().unlock();
如何获取读锁
reentrantReadWriteLock.readLock().lock();
reentrantReadWriteLock.readLock().unlock();
测试用例
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Test {
private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
private double integer=0;
public void put(){
reentrantReadWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+"ready to put data");
try {
Thread.sleep((long) (Math.random()*1000));
}catch (Exception e){
e.printStackTrace();
}
integer=Math.random()*10;
System.out.println(Thread.currentThread().getName()+"had put the data:"+integer);
reentrantReadWriteLock.writeLock().unlock();
}
public void get(){
reentrantReadWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+"ready to get data");
try {
Thread.sleep((long) (Math.random()*1000));
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"had get the data:"+integer);
reentrantReadWriteLock.readLock().unlock();
}
public static void main(String[] args) {
Test test=new Test();
for(int i=0;i<4;i++){
new Thread() {
public void run() {
test.put();
}
}.start();
}
for(int i=0;i<4;i++){
new Thread() {
public void run() {
test.get();
}
}.start();
}
}
}
执行结果:
Thread-0ready to put data
Thread-0had put the data:9.312718551432198
Thread-1ready to put data
Thread-1had put the data:2.3961302731992196
Thread-2ready to put data
Thread-2had put the data:7.6995931493714656
Thread-3ready to put data
Thread-3had put the data:5.831579769287028
Thread-4ready to get data
Thread-5ready to get data
Thread-6ready to get data
Thread-7ready to get data
Thread-6had get the data:5.831579769287028
Thread-4had get the data:5.831579769287028
Thread-7had get the data:5.831579769287028
Thread-5had get the data:5.831579769287028
可以看到写的时候锁住了,读的时候是不可重入的。注意使用同一把锁