【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
2013-11-16 19:56
656 查看
先看一个程序
读与读不互斥、读与写互斥、写与写互斥
与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。
运行结果:0、2、4还没读完,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;
}
}
读与读不互斥、读与写互斥、写与写互斥
与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。
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;
}
}
相关文章推荐
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 读写锁接口实例-通过ReadWriteLock实现一个简单的缓存
- java 多线之用ReadWriteLock实现 一个简单缓存
- 利用ReentrantReadWriteLock实现缓存系统
- JAVA ReentrantReadWriteLock AND 缓存系统
- java做一个缓存类(应用TimerTask和ReadWriteLock)
- java多线程:并发包中ReentrantReadWriteLock读写锁的锁降级模板 写锁降级为读锁
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- 深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)
- sys_read()/vfs_read()/vfs_write() Linux VFS文件系统之读写(read/write)文件
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- 深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)
- Linux VFS文件系统之读写(read/write)文件
- Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统
- java多线程学习10-使用ReentrantReadWriteLock的一个例子
- ReentrantReadWriteLock读写锁的使用
- 设计模式 Concurrency 之 ReadWriteLock 读写锁
- ReentrantLock 重入锁, ReadWriteLock 读写锁
- ReentrantReadWriteLock读写锁
- JAVA多线程之——读写锁 ReentrantReadWriteLock