秒杀多线程第十四篇 读者写者问题继 读写锁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 --暂无内容-待更新
随机推荐
- 我与虚拟机的初次接触及初探Liux命令 20155338
初识虚拟机及学习Linux命令的些许收获 虚拟机的安装 这个假期算是第一次正式的接触了虚拟机,以前在平时生活中也有听到过,但是真正自己动手安装虚拟机却是第一次,确实是既紧张又兴奋. 我是依据老师所发的 ...
- WPF RoutedEvent and HitTest - 简书
原文:WPF RoutedEvent and HitTest - 简书 学习的时候切忌心浮气躁,慢慢的过每一个知识点,不要漏掉任何细节.不然当遇到细节问题的时候,会恼,会闹,会悔不该当初--花一下午调 ...
- 4040 EZ系列之奖金 (拓扑)
4040 EZ系列之奖金 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 由于无敌的WRN在2015年世界英俊帅 ...
- idea 单元测试 mybatis spring-test 异常: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
因为在idea中必须在test下才能进行单元测试,所以进行单元测试时,ssm的项目会因为找不到resourece中的配置文件而报错 这里 org.apache.ibatis.binding.Bindi ...
- 第六篇 native 版本的Postman如何通过代理服务器录制Web及手机APP请求
第四篇主要介绍了chrome app版本的postman如何安装及如何录制Web脚本,比较简单. 但是chrome app 版本和native 版本相比,对应chrome app 版本官方已经放弃支持 ...
- 经典教程|10 分钟速成 Python3
Python 是由吉多·范罗苏姆(Guido Van Rossum)在 90 年代早期设计. 它是如今最常用的编程语言之一.它的语法简洁且优美,几乎就是可执行的伪代码. 注意:这篇教程是基于 Pyth ...
- fastCMS数据库相关操作类
fastCMS针对数据库的操作有以下几个类: 1.[paging_Class]分页类 此类用于分页检索数据库内符合条件的记录 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left ...
- 爬虫2.4-scrapy框架-图片分类下载
目录 scrapy框架-图片下载 1 传统下载方法: 2 scrapy框架的下载方法 3 分类下载完整代码 scrapy框架-图片下载 python小知识: map函数:将一个可迭代对象的每个值,依次 ...
- Python3实现机器学习经典算法(二)KNN实现简单OCR
一.前言 1.ocr概述 OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然 ...
- Hyperledger_Fabric_Model
Hyperledger_Fabric_Model 本部分描述了Hyperledger Fabric的主要设计特点 Assets: 资产定义使得任何东西都可以通过货币值在网络中交易,从食物到老爷车再到期 ...