12.Java5读写锁技术的妙用

 1 import java.util.Random;
 2 import java.util.concurrent.locks.ReadWriteLock;
 3 import java.util.concurrent.locks.ReentrantReadWriteLock;
 4 /**
 5  *
 6  * @author LiTaiQing
 7  *
 8  */
 9 public class ReadWriteLockTest {
10     public static void main(String[] args){
11         final Queue3 q3 = new Queue3();
12
13         for (int i = 0; i < 3; i++) {
14             new Thread(){
15                 @Override
16                 public void run(){
17                     while(true){
18                         q3.get();
19                     }
20                 }
21             }.start();
22
23             new Thread(){
24                 @Override
25                 public void run() {
26                     q3.put(new Random().nextInt(10000));
27                 };
28             }.start();
29
30         }
31
32     }
33
34 }
35 class Queue3{
36     private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
37     //读写锁-实现类ReentrantReadWriteLock
38     ReadWriteLock rwl = new ReentrantReadWriteLock();
39     public void get(){
40         rwl.readLock().lock();
41         try {
42             System.out.println(Thread.currentThread().getName() + " be ready to read data!");
43             Thread.sleep((long)(Math.random()*1000));
44             System.out.println(Thread.currentThread().getName() + "have read data :" + data);
45         } catch (InterruptedException e) {
46             e.printStackTrace();
47         }finally{
48             rwl.readLock().unlock();
49         }
50     }
51     public void put(Object data){
52         rwl.writeLock().lock();
53         try {
54             System.out.println(Thread.currentThread().getName() + " be ready to write data!");
55             Thread.sleep((long)(Math.random()*1000));
56             this.data = data;
57             System.out.println(Thread.currentThread().getName() + " have write data: " + data);
58         } catch (InterruptedException e) {
59             e.printStackTrace();
60         }finally{
61             rwl.writeLock().unlock();
62         }
63     }
64 }
 1 import java.util.HashMap;
 2 import java.util.Map;
 3 import java.util.concurrent.locks.ReadWriteLock;
 4 import java.util.concurrent.locks.ReentrantReadWriteLock;
 5 /**
 6  * 面试题,写一个缓存系统
 7  * @author LiTaiQing
 8  *
 9  */
10 public class CacheDemo {
11
12     private Map<String,Object> cache = new HashMap<String,Object>();
13
14     public static void main(String[] args) {
15
16     }
17     /**
18      *    读写锁的应用
19      */
20     private ReadWriteLock rwl = new ReentrantReadWriteLock();
21     public Object getData(String key){
22         rwl.readLock().lock();
23         Object value = null;
24         try{
25             value =    cache.get(key);
26             if(value == null){
27                 rwl.readLock().unlock();
28                 rwl.writeLock().lock();
29                 try{
30                     if(value == null){
31                         value = "abc";//实际是去queryDB();
32                     }
33                 }finally{
34                     rwl.writeLock().unlock();
35                 }
36                 rwl.readLock().lock();
37             }
38         }finally{
39             rwl.readLock().unlock();
40         }
41         return value;
42     }
43
44 }
时间: 2024-11-10 13:38:17

12.Java5读写锁技术的妙用的相关文章

java5读写锁用法

读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可.如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁:如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁.总之,读的时候上读锁,写的时候上写锁! 三个线程读数据,三个线程写数据示例:可以同时读,读的时候不能写,不能同时写,写的时候不能读.读的时候上读锁,读完解锁:写的时候上写锁,写完解锁.注意finally解锁. package com.ljq.test.threa

Linux同步技术之读写锁

互斥锁试图将想进入临界区的所有线程都阻塞住,但是有时候该临界区会涉及由这些线程共享的一个或多个数据的访问或更新,这时候我们就需要用到读写锁. 系统读写锁的分配规则: (1)只要有没有线程持有给定的读写锁用于写,那么任意数量的线程可以持有该读写锁用于读.(系统规定写锁优先,但是可以更改为读锁优先) (2)仅当没有线程持有某个读写锁用于读或用于写时,才能分配该读写锁用于写. 读写锁用于读称为共享锁,读写锁用于写称为独占锁. 读写锁的获取与释放: int pthread_rwlock_rdlock(p

比较synchronized和读写锁

一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用,在这就不多说只做几点归纳: Java提供这个关键字,为防止资源冲突提供的内置支持.当任务执行到被synchronized保护的代码片段的时候,它检查锁是否可用,然后获取锁,执行代码,释放锁. 常用这个关键字可以修饰成员方法和代码块 2)读写锁 我们对数据的操作无非两种:“读”和“写”,试想一个这样的

Java读-写锁

显示锁 在java5.0之前,在协调共享对象访问时可以使用的机制只有synchronized和volatile.java5.0增加了一种新的机制:ReentrantLock.ReentrantLock并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能.与内置锁不同的是Lock提供了一个无条件的.可轮询的.定时的以及可中断的锁获取操作,所有加锁和解锁都是显示的.在Lock的实现中必须提供与内部锁相同的内存可见性语义. /**Lock接口*/ public interface

【Java并发工具类】StampedLock:比读写锁更快的锁

前言 ReadWriteLock适用于读多写少的场景,允许多个线程同时读取共享变量.但在读多写少的场景中,还有更快的技术方案.在Java 1.8中, 提供了StampedLock锁,它的性能就比读写锁还要好.下面我们介绍StampedLock的使用方法.内部工作原理以及在使用过程中需要注意的事项. StampedLock支持的三种锁模式 ReadWriteLock支持两种访问模式:读锁和写锁,而StampedLock支持三种访问模式:写锁.悲观读锁和乐观读. 其中写锁和悲观读锁的语义与ReadW

Java并发程序设计(15)并发锁之读写锁(续二)写锁降级

1.1.1. 读写锁应用之三写锁降级 ReentrantReadWriteLock还具有写锁降级的特点,而这跟可重入性有一些关系. (1)持有写锁时可以降级为读锁. (2)持有读锁时不能升级为写锁. ReentrantReadWriteLock和ReentrantLock相似的是都有一个特点,就是可重入.可重入指已经获取到锁的线程可以再次获取锁,保证lock和unlock的次数相同即可. package com.test.concurrence; import java.util.Random;

Java并发程序设计(13)并发锁之读写锁

1.1.1. 读写锁的应用之一读写分离 读写锁ReentrantReadWriteLock相对于ReentrantLock在特定情况下能提高同步性能,这是因为读写锁有以下特点: (1)读和读可以同时进行. 这一点是ReentrantLock所没有的优点. (2)读和写不能同时进行. (3)写和写不能同时进行. 应用读写锁访问资源的代码如下所示. class MySharedResource { private ReadWriteLock lock = new ReentrantReadWrite

linux线程同步(3)-读写锁

一.概述                                                    读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区,读写锁比它有更高的并行性.读写锁有以下特点: 1.如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样就可以多个线程并行操作.但这个时候,如果再进行写锁加锁就会发生阻塞,写锁请求阻塞后,后面如果继续有读锁来请求,这些后来的读锁都会被阻塞!这样避免了读锁长期占用资源,防止写锁饥饿

动手实现读写锁

排他锁的弊端 在多个线程之间共享数据,普遍做法是加锁读写,也就是同一个时刻只有一个线程能够读或者写,以保证数据一致性,即线程安全.例如下面的代码是普遍的做法 1 void Read() 2 { 3 Lock(mutex); 4 5 // 读取数据 6 7 UnLock(mutex); 8 } 9 10 void Write() 11 { 12 Lock(mutex); 13 14 // 写入数据 15 16 UnLock(mutex); 17 } 读写锁的设计 这样的锁是具有排他性的,会在一定程