先看一个程序
读与读不互斥、读与写互斥、写与写互斥
与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。
package xiaozhijingtian;
import java.util.Random;
public class ReadWriteLockTest {
public static void main(String[] args) {
final ReadWriteObject object=new ReadWriteObject();
for(int i=0;i<3;i++)
{
new Thread(){
public void run() {
while(true)
object.read();
};
}.start();
new Thread(){
public void run() {
while(true)
object.write(new Random().nextInt(10));
};
}.start();
}
}
}
class ReadWriteObject{
private int data;
public void read()
{
System.out.println(Thread.currentThread().getName()+"我正准备读呢");
try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"读出来了:"+data);
}
public void write(int data)
{
System.out.println(Thread.currentThread().getName()+"我正准备写呢");
try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}
this.data=data;
System.out.println(Thread.currentThread().getName()+"写完了:"+data);
}
}
运行结果:0、2、4还没读完,1线程就开始写了
Thread-0我正准备读呢
Thread-2我正准备读呢
Thread-4我正准备读呢
Thread-1我正准备写呢
Thread-5我正准备写呢
Thread-3我正准备写呢
Thread-1写完了:8
Thread-1我正准备写呢
Thread-3写完了:7
Thread-3我正准备写呢
Thread-4读出来了:7
下面让读写锁展示一下自己的独门绝技
package xiaozhijingtian;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockTest {
public static void main(String[] args) {
final ReadWriteObject object=new ReadWriteObject();
for(int i=0;i<3;i++)
{
new Thread(){
public void run() {
while(true)
object.read();
};
}.start();
new Thread(){
public void run() {
while(true)
object.write(new Random().nextInt(10));
};
}.start();
}
}
}
class ReadWriteObject{
private int data;
private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
public void read()
{
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+"我正准备读呢");
try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName()+"读出来了:"+data);
readWriteLock.readLock().unlock();
}
public void write(int data)
{
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+"我正准备写呢");
try { Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) {}
this.data=data;
System.out.println(Thread.currentThread().getName()+"写完了:"+data);
readWriteLock.writeLock().unlock();
}
}
运行结果
Thread-0我正准备读呢
Thread-2我正准备读呢
Thread-4我正准备读呢
Thread-0读出来了:0
Thread-4读出来了:0
Thread-2读出来了:0
Thread-1我正准备写呢
Thread-1写完了:8
Thread-1我正准备写呢
Thread-1写完了:9
Thread-1我正准备写呢
Thread-1写完了:9
Thread-1我正准备写呢
Thread-1写完了:9
Thread-1我正准备写呢
Thread-1写完了:2
Thread-3我正准备写呢
Thread-3写完了:4
Thread-3我正准备写呢
Thread-3写完了:4
Thread-3我正准备写呢
Thread-3写完了:0
Thread-3我正准备写呢
Thread-3写完了:9
Thread-5我正准备写呢
Thread-5写完了:8
Thread-5我正准备写呢
Thread-5写完了:1
Thread-0我正准备读呢
Thread-4我正准备读呢
Thread-2我正准备读呢
Thread-4读出来了:1
Thread-2读出来了:1
Thread-0读出来了:1
Thread-1我正准备写呢
Thread-1写完了:3
Thread-1我正准备写呢
Thread-1写完了:1
Thread-1我正准备写呢
Thread-1写完了:2
Thread-3我正准备写呢
Thread-3写完了:0
Thread-5我正准备写呢
Thread-5写完了:3
Thread-5我正准备写呢
Thread-5写完了:9
Thread-5我正准备写呢
Thread-5写完了:2
Thread-5我正准备写呢
Thread-5写完了:2
Thread-4我正准备读呢
Thread-2我正准备读呢
Thread-0我正准备读呢
Thread-2读出来了:2
Thread-4读出来了:2
Thread-0读出来了:2
Thread-1我正准备写呢
自己写一个缓存系统
package com.xiaozhi.threadlocal2;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Test3 {
public static void main(String[] args) {
}
}
class Cache{
private Map<String,Object>map=new HashMap<String, Object>();
private ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
public Object get(String key){
readWriteLock.readLock().lock();
Object value = null;
try {
value = map.get(key);
if(value==null)
{
readWriteLock.readLock().unlock();
readWriteLock.writeLock().lock();
try {
if(value==null)
value="jingtianxiaozhi";//QueryDB(key)
} finally{
readWriteLock.writeLock().unlock();
}
readWriteLock.readLock().lock();
}
} finally{
readWriteLock.readLock().unlock();
}
return value;
}
}