美文网首页
[097] 技术-java中的读写锁

[097] 技术-java中的读写锁

作者: shawnxjf | 来源:发表于2017-12-19 21:42 被阅读0次

读写所概念

我们平常通过锁来对进程进行协同。
但如果在读多写少的场景(可以允许多个读同时进行不影响)也使用普通的锁,会严重影响程序的性能。
为了解决这个问题引入读写锁,请看下面场景1:
1.读线程:如果thread在写resource的时候,其他read和write线程都终止。
2.写线程:可以允许多个thread同时读取resource。

我们先澄清一下定义和规则:
a.如果一个线程是读取资源就叫读线程,如果是写资源就叫写线程。
b.为了实现上面的“场景1”的要求,在代码中我们需要在读操作加上read锁,在写操作加上write锁。

读写所机制伪代码讲解

ReadWriteLock wrLock = new ReentrantReadWriteLock();

read线程执行获取读锁:

get(){
    wrlock.getReadLock.lock();
     ...println(Thread.currentThread().getName() + " 准备读数据!");  
            /* 休眠 */  
     ...println(Thread.currentThread().getName() + "读取完毕 :" + data);  
    wrlock.getReadLock.unlock();
}

write线程执行获取写锁:

put(){
    wrlock.getWriteLock.lock();
    ...println(Thread.currentThread().getName() + " 准备写入数据!");  
            /* 休眠 */  
     ...println(Thread.currentThread().getName() + "写入完毕");  
    wrlock.getWriteLock.unlock();
}

运行结果为:
/*******a b 两个线程同时执行*****/
a准备读取数据
b准备读取数据
a读取完毕
b读取完毕

/一次只有一个写线程,所以先c执行再d执行*/
// c线程执行
c准备写入数据!
c写入完毕
// d线程执行
d准备写入数据!
d写入完毕

如何使用

加锁是使其资源原子性,不管其资源是内存还是数据库。

我们并发控制的是资源不是代码?比如如下代码如何协同:
A: code1 code2
B: code1 code2

想象执行序列:
a).A,B线程都执行到code1 :A :code1 B:code1。
b).A执行到code1,B执行到code2。

不管执行序列如何,我们必须通过同一个lock对象来协同线程的访问。
在该排他代码的地方加 write锁,在非排他地方加read锁。

参考

http://tutorials.jenkov.com/java-concurrency/read-write-locks.html

相关文章

  • [097] 技术-java中的读写锁

    读写所概念 我们平常通过锁来对进程进行协同。但如果在读多写少的场景(可以允许多个读同时进行不影响)也使用普通的锁,...

  • 锁2

    5、读写锁 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到...

  • 读写锁的原理

    读写锁的使用 读写锁在 Java 中是 ReentrantReadWriteLock,使用方式是: Reentra...

  • Java 多线程并发读写锁 ReadWriteLock 实现原理

    转自: 搜狐技术产品 作者:汪建 关于读写锁 Java语法层面的synchronized锁和JDK内置可重入锁R...

  • ReentrantReadWriteLock源码解析

    ReentrantReadWriteLock编码示例 上面的代码展示读写锁的使用,读写锁的介绍参考Java锁[ht...

  • java中的读写锁

    引言 锁(Lock)是java一个很重要的同步组件,Lock提供了跟synchronized关键字一样的功能,相比...

  • Java中对锁的理解

    Java中锁的种类划分 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁...

  • 锁的优化

    在前几天的文章:浅谈Java中的锁:Synchronized、重入锁、读写锁 中我们学习了多线程环境下为了保证线程...

  • java concurrency <读写锁>

    java concurrency <读写锁> 背景 读/写锁比Lock中的Lock所示的Lock实现更复杂。 想象...

  • ZooKeeper + Curator 实现分布式锁

    在 JDK 的 java.util.concurrent.locks 中, 为我们提供了可重入锁, 读写锁, 及超...

网友评论

      本文标题:[097] 技术-java中的读写锁

      本文链接:https://www.haomeiwen.com/subject/paaiwxtx.html