秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock (续)
java 包实现了读写锁的操作:
package com.multithread.readwritelock; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import com.multithread.main.ExampleInterface;
import com.multithread.readwrite.WriteThread; public class ReadWriteLockExample extends ExampleInterface { public ReadWriteLock mReadwriteLock = new ReentrantReadWriteLock(false);
public File mFile = null;
public int mCash = ;
public CountDownLatch mLatchDown = new CountDownLatch();
private boolean mStopedFlag = false; @Override
public void startDemo() {
// TODO Auto-generated method stub
mFile = new File("H:\\Project\\SST\\123.txt");
try { mFile.createNewFile();
Executor mEcecutor = Executors.newFixedThreadPool( + );
mEcecutor.execute(new Reader("Reader1"));
mEcecutor.execute(new Reader("Reader2"));
mEcecutor.execute(new Reader("Reader3"));
mEcecutor.execute(new Reader("Reader4"));
mEcecutor.execute(new Writer("Writer1", ));
mEcecutor.execute(new Writer("Writer2", -)); mLatchDown.await();
System.out.println("[startDemo]" + "Demo down"); } catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public class Reader extends Thread { public String name = null;
boolean flag = true;
private int index = ; public Reader(String name) {
this.name = name;
} @Override
public void run() {
while (flag) {
try {
mReadwriteLock.readLock().lock();
System.out.println("[Reader]" + name + "start");
Thread.sleep((long) (Math.random() * ));
if (!mStopedFlag) {
System.out.println("[Reader]" + name + "get mcash now:"
+ mCash);
} else {
flag = false;
}
Thread.sleep((long) (Math.random() * ));
System.out.println("[Reader]" + name + "down");
mReadwriteLock.readLock().unlock();
Thread.sleep((long) (Math.random() * ));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
mLatchDown.countDown(); } } public class Writer extends Thread { public String name = null;
boolean flag = true;
private int index = ;
private int cash = ; public Writer(String name, int addcash) {
this.name = name;
this.cash = addcash;
} @Override
public void run() {
System.out.println("[Writer]" + name + "start");
while (flag) { try {
mReadwriteLock.writeLock().lock();
System.out.println("[Writer]" + name + "start");
Thread.sleep((long) (Math.random() * ));
int oldcash = mCash;
if (mCash <= ) {
flag = false;
mStopedFlag = true;
} else {
mCash += cash;
System.out.println("[Writer]" + name
+ "operator cash old:" + oldcash + " To:"
+ mCash);
}
Thread.sleep((long) (Math.random() * ));
System.out.println("[Writer]" + name + "down");
mReadwriteLock.writeLock().unlock();
Thread.sleep((long) (Math.random() * ));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
mLatchDown.countDown();
} } }
读写锁的特点就是:
1.写者与读者是互斥的
2.每个写者之间是互斥的
3.读者之间可以同时进行
秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock (续)的更多相关文章
- 转---秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- 多线程面试题系列(14):读者写者问题继 读写锁SRWLock
在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...
- 读者写者问题继 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...
- 转---秒杀多线程第十二篇 多线程同步内功心法——PV操作上 (续)
PV操作的核心就是 PV操作可以同时起到同步与互斥的作用. 1.同步就是通过P操作获取信号量,V操作释放信号量来进行. 2.互斥其实就是,同时操作P操作,结束后进行V操作即可做到. Java上实现PV ...
- 多线程 读写锁SRWLock
在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...
- 第十四篇 Integration Services:项目转换
本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
随机推荐
- 20155332 2016-2017-2 《Java程序设计》第10周学习总结
20155332 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技 ...
- 20145226 《Java程序设计》第3周学习总结
教材学习内容总结 学习目标 区分基本类型与类类型 理解对象的生成与引用的关系 掌握String类和数组 理解封装的概念 掌握构造方法的定义 理解重载的概念 掌握static的应用 教材第四章内容总结 ...
- [WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]
Description 传送门 Solution 看到那个式子,显然想到分数规划...(不然好难呢) 然后二分答案,则每条边的权值设为g(e)-ans.最后要让路径长度在[L,U]范围内的路径权值&g ...
- Java——RMI
之前分布式系统调用用的是比较老的EJB,当时还是作为服务调用方,去调用别的系统的服务.最近发现新公司里面,用的是RMI,查了下发现EJB的底层实现就是RMI,也算是熟悉了... 一,使用JDK 中的R ...
- 解析hdr图像文件的python实现
如题 import cv2 import numpy as np def rgbe2float(rgbe): res = np.zeros((rgbe.shape[0],rgbe.shape[1],3 ...
- requests,unittest——多接口用例,以及需要先登录再发报的用例
之前写过最简单的接口测试用例,本次利用unittest进行用例管理,并出测试报告,前两个用例是两个不同网页的get用例,第三个是需要登录才能访问的网页A,并在其基础上访问一个需要在A页面点开链接才能访 ...
- SteamVR Unity Plugin - v2.0.1中的InteractionSystem
最近写VR项目的时候用到了SteamVR Unity Plugin - v2.0.1插件,感觉比之前用到的SteamVR plugin for Unity - v1.2.2版本改进了很多,就算不用VR ...
- 用Python实现多站点运维监控
在小型公司里如果产品线单一的话,比如就一个app, 一般1~2个运维就够用了.如果产品过于庞大,就需要多个运维人员. 但对于多产品线的公司来说,运维人员就要必须分多个人负责,因为超过200个站点让1个 ...
- Zookeeper-----Zookeeper概述
一:Zookeeper的概念? ZooKeeper是一种分布式协调服务,用于管理大型主机.在分布式环境中协调和管理服务是一个复杂的过程.ZooKeeper通过其简单的架构和API解决了这个问题.Zoo ...
- Hyperledger Fabric CouchDB as the State Database——使用CouchDB
使用CouchDB作为状态数据库 状态数据库选项 状态数据库包括LevelDB和CouchDB.LevelDB是嵌入在peer进程中的默认键/值状态数据库,CouchDB是一个可选的外部状态数据库.与 ...