浅谈读写锁WriteReadLock
来源:互联网 发布:淘宝lv女包 编辑:程序博客网 时间:2024/06/08 01:34
前言
在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥出来。
简单来说,可以多个线程同时读资源,但是写这种修改资源的操作只有一个线程能做。
WriteReadLock能实现,当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。
package com.pochi.juc;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadAndWriteLockProblem { public static void main(String[] args) { ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); ReadAndWriteLockDemo readAndWriteLockDemo = new ReadAndWriteLockDemo(reentrantReadWriteLock); // 搞一个修改资源的线程 new Thread("Producer") { @Override public void run() { readAndWriteLockDemo.set(); } }.start(); // 搞5个读资源的操作 for (int i = 0; i < 5; i++) { new Thread("Consumer" + i) { @Override public void run() { readAndWriteLockDemo.get(); } }.start(); } }}class ReadAndWriteLockDemo { private int count; private ReadWriteLock readWriteLock; Lock readLock; Lock writeLock; // 传进来读写锁,分别获得读锁和写锁 public ReadAndWriteLockDemo(ReadWriteLock readWriteLock) { this.readWriteLock = readWriteLock; readLock = readWriteLock.readLock(); writeLock = readWriteLock.writeLock(); } // 在修改操作的是,写锁在操作 public void set() { writeLock.lock(); try { count++; System.out.println(Thread.currentThread().getName() + "::" + count); } finally { writeLock.unlock(); } } // 读的时候,读锁操作 public void get() { readLock.lock(); try { System.out.println(Thread.currentThread().getName() + "::" + count); } finally { readLock.unlock(); } }}
我有一个问题
我不太懂,为什么要用读锁?
如果我们这样呢?不用读写锁,只有在修改资源的时候,加锁,读的时候,不加锁,会怎么样?因为如果是上面这个操作的话,其实只有一步,应该是原子性操作吧?加不加锁,没差吧???
阅读全文
0 0
- 浅谈读写锁WriteReadLock
- ReadWrite读写锁与传统锁 浅谈
- 浅谈内存读写
- 浅谈二进制文件读写和文本文件读写的区别
- 浅谈二进制文件读写和文本文件读写的区别
- 浅谈二进制文件读写和文本文件读写的区别
- 浅谈二进制文件读写和文本文件读写的区别
- 浅谈JAVA字节流(读写文件)
- Python实例浅谈之六读写文件
- 浅谈Android平台物理内存读写漏洞
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- 读写锁
- iOS runtime ~ class_copyPropertyList与class_copyIvarList区别
- 外网能访问内网的WEB服务器上的站点方法
- 导入数据到数据库出现data truncated for column 错误
- 数组与矩阵---数组的partiton调整
- 架构师之路--多线程之守护线程
- 浅谈读写锁WriteReadLock
- 类创建对象和类指针创建对象的内存表现以及区别
- P2604网络扩容
- bat脚本%cd%和%~dp0获取当前目录区别
- 子DIV块中设置margin-top时影响父DIV块位置的解决办法
- Ubuntu 16.04-LTS 系统安装
- mysql,oracle连接字符串
- 【9.21】 就爱你 爱自己
- 修改配置项