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虚拟机所管理的内存包括以下几个运行时的数据区域:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面对其进行介绍: 程序计数器 它是一块较小的内存空间,可以看做当前线程做执行的字节码的信号指示器 ...
随机推荐
- maven设计思想
20171108 maven设计思想? archetype 插件 学习插件.
- Gumbel-Softmax Trick和Gumbel分布
之前看MADDPG论文的时候,作者提到在离散的信息交流环境中,使用了Gumbel-Softmax estimator.于是去搜了一下,发现该技巧应用甚广,如深度学习中的各种GAN.强化学习中的A2 ...
- IdentityServer4之JWT签名(RSA加密证书)及验签
一.前言 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢? 二.JWT与Reference Token ...
- python 并集union, 交集intersection, 差集difference, 对称差集symmetric_difference
python的集合set和其他语言类似,是一个无序不重复元素集, 可用于消除重复元素. 支持union(联合), intersection(交), difference(差)和sysmmetric d ...
- bzoj4641 基因改造 KMP / hash
依稀记得,$NOIP$之前的我是如此的弱小.... 完全不会$KMP$的写法,只会暴力$hash$.... 大体思路为把一个串的哈希值拆成$26$个字母的位权 即$hash(S) = \sum\lim ...
- Needed Learning(Updating)
决定把掌握不熟练或是模型见的少的知识点在这里列一列 希望能在自己AFO前成功get技能点吧…… 优先级:动态规划-分治-字符串-图论-数据结构-数学-计算几何-其它 动态规划 1.四边形不等式优化 2 ...
- nginx安装第三方模块
原已经安装好的nginx,现在需要添加一个未被编译安装的模块 举例说明:安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存) nginx的模块是需要重新编译nginx,而不是像a ...
- Elasticsearch 横向扩容以及容错机制
写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...
- python开发_thread_线程_搜索本地文件
在之前的blog中,曾经写到过关于搜索本地文件的技术文章 如: java开发_快速搜索本地文件_小应用程序 python开发_搜索本地文件信息写入文件 下面说说python中关于线程来搜索本地文件 利 ...
- Codeforces Round #361 (Div. 2) A. Mike and Cellphone 水题
A. Mike and Cellphone 题目连接: http://www.codeforces.com/contest/689/problem/A Description While swimmi ...