Java并发学习之十五——使用读写锁同步数据訪问
本文是学习网络上的文章时的总结。感谢大家无私的分享。
读写锁重要的是写锁的使用,仅仅用一个入口。
以下是读写锁使用的样例
package chapter2; import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; public class PricesInfo {
private int price1;
private int price2;
private ReadWriteLock lock;
public PricesInfo(){
price1 = 1;
price2 = 1;
lock = new ReentrantReadWriteLock(); }
public int getPrice1() {
lock.readLock().lock();
int value = price1;
lock.readLock().unlock();
return value;
}
public void setPrice1(int price1) {
this.price1 = price1;
}
public int getPrice2() {
lock.readLock().lock();
int value = price2;
lock.readLock().unlock();
return value;
}
public void setPrice2(int price2) {
this.price2 = price2;
} public void setPrices(int price1,int price2){
lock.writeLock().lock();
this.price1 = price1;
this.price2 = price2;
lock.writeLock().unlock();
}
}
package chapter2;
public class Reader implements Runnable{
private PricesInfo pricesInfo;
public Reader(PricesInfo pricesInfo){
this.pricesInfo = pricesInfo;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.printf("%s:Price 2:%d\n", Thread.currentThread().getName(),pricesInfo.getPrice2());
System.out.printf("%s:Price 1:%d\n", Thread.currentThread().getName(),pricesInfo.getPrice1());
}
}
}
package chapter2;
import java.util.Random;
public class Writer implements Runnable{
private PricesInfo pricesInfo;
public Writer(PricesInfo pricesInfo){
this.pricesInfo = pricesInfo;
}
@Override
public void run() {
for(int i=0;i<3;i++){
int p1 = new Random().nextInt(47);
int p2 = new Random().nextInt(47)*10;
System.out.println("Writer:Attempt to modify the prices."+p1+" price2:"+p2);
pricesInfo.setPrices(p1, p2);
System.out.println("Writer:Prices have been modified."+p1+" price2:"+p2);
try {
Thread.sleep(2);
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
package chapter2;
public class Main6 {
/**
* <p>
* </p>
* @author zhangjunshuai
* @date 2014-9-17 上午11:17:50
* @param args
*/
public static void main(String[] args) {
PricesInfo pricesInfo = new PricesInfo();
Reader reader[] = new Reader[5];
Thread threadsReader[] = new Thread[5];
for (int i = 0; i < threadsReader.length; i++) {
reader[i] = new Reader(pricesInfo);
threadsReader[i]=new Thread(reader[i]);
}
Writer writer = new Writer(pricesInfo);
Thread threadWriter = new Thread(writer);
for (int i = 0; i < threadsReader.length; i++) {
threadsReader[i].start();
}
threadWriter.start();
}
}
Java并发学习之十五——使用读写锁同步数据訪问的更多相关文章
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- 十五、读写锁ReentrantReadWriteLock
一.简介 有时候我们对资源的修改操作非常地少,但是读取的频率却很高.如果采用一般的互斥锁,那么大量的读取操作也需要做等待.基于读写分离的思想,我们可以使用JDK的读写锁来处理这种情况. 1)读读不互斥 ...
- Java并发学习之十九——线程同步工具之Phaser
本文是学习网络上的文章时的总结.感谢大家无私的分享. JDK 1.7 加入了一个新的工具Phaser.Phaser的在功能上与CountDownLatch有部分重合. 以下使用Phaser类来同步3个 ...
- java web学习总结(十五) -------------------JSP基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- Java基础学习笔记十五 集合、迭代器、泛型
Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都 ...
- java并发编程(十五)----(线程池)java线程池简介
好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...
- Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析
一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...
- java并发编程(十五)内存可见两种方式 加锁和volatile
1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制. ...
- java虚拟机学习笔记(五)---运行时的数据区域
Java虚拟机所管理的内存包括以下几个运行时的数据区域:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面对其进行介绍: 程序计数器 它是一块较小的内存空间,可以看做当前线程做执行的字节码的信号指示器 ...
随机推荐
- Winsock—I/O模型之选择模型(一)
Winsock中提供了一些I/O模型帮助应用程序以异步方式在一个或多个套接字上管理I/O. 这样的I/O模型有六种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect ...
- linux服务开机启动
1.chkconfig 配置开机启动 在 /etc/init.d 创建执行服务的可执行脚本,赋予脚本可执行权限.如果是通过yum 或者rpm安装的,并且已经在该目录下存在对应的启动脚本,就不用自己 ...
- 微信公众号开发--用.Net Core实现微信消息加解密
1.进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2.设置为安全模式 3.代码实现(主要分为验证接口和 ...
- hdoj1232 畅通工程(并查集)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1232 思路 使用并查集求解. 代码 #include <iostream> #includ ...
- php7的新特性
新增操作符1.??$username = $_GET['user'] ?? '';$username = isset($_GET['user']) ? $_GET['user'] : 'nobody' ...
- C# 中使用 Task 实现提前加载
介绍一种/两种可以提前做点什么事情的方法. 场景 在UI线程中执行耗时操作,如读取大文件,为了不造成UI卡顿,常采用异步加载的方式,即 async/await . 通常的写法是这样的: private ...
- read file into shell vars
test.ksh value=$(<rosstest.txt)echo $value
- 1008 Elevator (20)(20 point(s))
problem The highest building in our city has only one elevator. A request list is made up with N pos ...
- php开启redis扩展
1.安装redis git下载地址https://github.com/MSOpenTech/redis/releases 2.测试redis windows 运行(快捷键:windows键+R键), ...
- android viewStub
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 开发应用的时候,需要根据条件决定显示某个视图, 这个时候可以用ViewStub Stub ...