public class ReadWriteLockTest {
public static void main(String[] args){
final Queue3 queue3 = new Queue3();
for(int i=0;i<3;i++){
new Thread(new Runnable() {
@Override
public void run() {
queue3.get();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
queue3.put();
}
}).start();
}
}
static class Queue3{
private ReadWriteLock lock=new ReentrantReadWriteLock();
public void get(){
lock.readLock().lock();
try{
System.out.println(Thread.currentThread().getName()+"ready read");
try {
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"had read");
}finally {
lock.readLock().unlock();
}
}
public void put(){
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"ready write");
try {
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"had write");
}finally {
lock.writeLock().unlock();
}
}
}
}
Thread-0ready read
Thread-0had read
Thread-1ready write
Thread-1had write
Thread-3ready write
Thread-3had write
Thread-5ready write
Thread-5had write
Thread-2ready read
Thread-4ready read
Thread-4had read
Thread-2had read
经典励志啊:使用读写锁实现缓存技术:
经典列子cacheData():
public class CacheDemo {
private Map<String,Object> map= map = new HashMap<>();
private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
public Object getData(String key){
readWriteLock.readLock().lock();
Object obj =null;
try{
obj=map.get(key);
if(obj==null){
readWriteLock.writeLock().lock();
try{
readWriteLock.readLock().unlock();
if(obj==null){
obj="aaa";//query db
}
}finally {
readWriteLock.writeLock().unlock();
}
readWriteLock.readLock().lock();
}
}finally {
readWriteLock.readLock().unlock();
}
return obj;
}
}
如有疑问,请发邮件:[email protected]
github: https://github.com/wangrui0/