您的位置:首页 > 其它

【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统

2013-11-16 19:56 656 查看
先看一个程序

读与读不互斥、读与写互斥、写与写互斥



与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: