秒杀多线程第十四篇 读者写者问题继 读写锁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 --暂无内容-待更新
随机推荐
- 一个命令安装lnmp
安装LNMP执行:wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.tar.gz && tar zxf lnmp1.3-full.tar. ...
- OpenStack入门篇(二)之OpenStack架构
1.OpenStack 架构 中间菱形是虚拟机,围绕 VM 的那些长方形代表 OpenStack 不同的模块(OpenStack 叫服务,后面都用服务这个术语),下面来分别介绍. Nova:管理 VM ...
- node升级7.0以上版本使用gulp时报错
今天使用gulp时 ,出现了以下报错信息: Error: Cannot find module 'internal/fs'at Object.<anonymous> (/home/XXX/ ...
- LUIS 语义识别API调用方法
本例使用itchat获取微信文字消息,发送给LUIS返回识别消息,再将返回消息格式化后通过微信发回 关于itchat的使用参考我的另外一篇随笔itchat个人练习 语音与文本图灵测试例程 # -*- ...
- div不设置高度背景颜色或外边框不能显示的解决方法
在使用div+css进行网页布局时,如果外部div有背景颜色或者边框,而不设置其高度,在浏览时出现最外层Div的背景颜色和边框不起作用的问题. 大体结构<div class="oute ...
- Java飞机大战MVC版
PlaneWar Java飞机大战MVC版 //无聊时偷的雷霆战机素材写了一个飞机大战,本意是练习mvc,但写得还是不清晰 github下载:https://github.com/dejavudwh/ ...
- JAVA学习笔记--简介几个常见关键字static、final、this、super
一.static static(静态的),可以放在类.方法.字段之前. 通常,当创建类时,就是在描述那个类的外观与行为.除非用 new 创建那个类的对象,否则,实际上并未获得任何对象.执行 new 来 ...
- ES6的新特性(8)——数组的扩展
数组的扩展 扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) / ...
- underscore.js源码解析(五)—— 完结篇
最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...
- SSH新学,关于面向对象的看法
流程:model-->dao-->service-->impService-->action 如果只是操作单个的一个表,比如user表,则都写到user的流程中 如果要操作俩个 ...