【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
来源:互联网 发布:天下3男捏脸大赛数据 编辑:程序博客网 时间:2024/06/05 02:23
先看一个程序
读与读不互斥、读与写互斥、写与写互斥
与互斥锁相比,读-写锁允许对共享数据进行更高级别的并发访问。
- 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;
- }
- }
0 0
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 利用读写锁写一个缓存系统
- 读写锁接口实例-通过ReadWriteLock实现一个简单的缓存
- QQ For Mac 闪亮登场 - JavaChat系统
- 线程ReadWriteLock 读写锁
- JDK5 读写锁 ReadWriteLock
- 读写锁ReadWriteLock
- java 读写锁 ReadWriteLock
- # 读写锁类ReadWriteLock #
- 读写锁ReadWriteLock
- ReadWriteLock : 读写锁
- 读写锁ReadWriteLock
- Java读写锁ReadWriteLock
- 读写锁:ReadWriteLock
- ReadWriteLock 读写锁测试
- 利用读写锁模拟一个缓存系统
- 用读写锁实现一个缓存系统
- 基站定位基础
- 多控制器-UITabBarController
- CSS 实用技巧,快快收藏好
- 项目中如何自定义异常类
- 微信开发第四篇:网页授权验证
- 【读写锁】ReadWriteLock闪亮登场、自己写一个缓存系统
- 使用eclispe出现的问题
- svn 节点处于冲突状态解决
- AS下Baidu Push的使用
- Maven搭建SpringMVC+Hibernate项目详解
- android中log输出工具类
- app中默认启动的activity
- 高性能流媒体服务器-nebula之数据结构(3)--AVL树定时器
- Myeclipse快捷键