实验存档。

允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写。

读者.java:

package operating.entity.readerwriter;

import operating.method.Semaphore;

public class Reader implements Runnable {
private static int total = 0;
private int id;
private Semaphore rmutex, wmutex;
private static int readCount = 0; public Reader(Semaphore rmutex, Semaphore wmutex) {
id = ++total;
this.rmutex = rmutex;
this.wmutex = wmutex;
} @Override
public void run() {
while (true) {
rmutex.p();
// 只有第一个读者进程需要执行 wmutex.p()
if (readCount == 0) wmutex.p();
readCount++;
rmutex.v(); // 执行读操作
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
} rmutex.p();
readCount--;
System.out.println(id + " 号读者结束阅读:当前还剩 " + readCount + " 位读者在读");
if (readCount == 0) wmutex.v();
rmutex.v();
}
}
}

写者.java:

package operating.entity.readerwriter;

import operating.method.Semaphore;

public class Writer implements Runnable {
private static int total = 0;
private int id;
private Semaphore wmutex; public Writer(Semaphore wmutex) {
id = ++total;
this.wmutex = wmutex;
} @Override
public void run() {
while (true) {
wmutex.p();
// 执行写操作
System.out.println(id + " 号写者正在写"); wmutex.v();
}
}
}

主函数.java:

package operating.test;

import operating.entity.readerwriter.Reader;
import operating.entity.readerwriter.Writer;
import operating.method.Semaphore; public class ReaderWriterTest {
public static void main(String[] args) {
// 实现写者与写者间、读者与写者间互斥
Semaphore wmutex = new Semaphore(1);
// 用于改变 readCount 变量时实现互斥
Semaphore rmutex = new Semaphore(1); for (int i = 0; i != 5; ++i) {
new Thread(new Writer(wmutex)).start();
new Thread(new Reader(rmutex, wmutex)).start();
}
}
}

/

Semaphore.java

Java 读者写者问题的更多相关文章

  1. Java读者写者问题

    实验存档. 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; import ...

  2. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  3. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  4. java 学习写架构必会几大技术点

    java 学习写架构必会几大技术点 关于学习架构,必须会的几点技术 1. java反射技术 2. xml文件处理 3. properties属性文件处理 4. 线程安全机制 5. annocation ...

  5. 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...

  6. 读者写者问题(有bug 后续更改)

    与上一篇<秒杀多线程第十篇 生产者消费者问题>的生产者消费者问题一样,读者写者也是一个非常著名的同步问题.读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文 ...

  7. 徒手用Java来写个Web服务器和框架吧<第三章:Service的实现和注册>

    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response> 这一章先把Web框架的功能说 ...

  8. 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response>

    徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 接上一篇,说到接受了请求,接下来就是解析请求构建Request对象,以及创建Response对象返回. 多有纰漏还请指出.省略 ...

  9. 多线程面试题系列(14):读者写者问题继 读写锁SRWLock

    在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...

随机推荐

  1. centos7.3搭建lamp实现使用wordpress

    ``` 环境说明: 在同一台主机上实现LAMP(Linux + Apache + MariaDB + PHP) CentOS 7.3.Apache 2.4.6.MariaDB 5.5.52.PHP 5 ...

  2. Django学习(2)数据宝库

    数据库是一所大宝库,藏着各种宝贝.一个没有数据库的网站,功能有限.在Django中,支持的数据库有以下四种: SQLite3 MySQL PostgreSQL Oracle 其中SQLite3为Dja ...

  3. java设计模式—多工厂模式

    概念           多个工厂模式,是对普通工厂方法的改进,在普通工厂模式中,如果字符串传递出错,则不能正   确创建对象,而多个工厂模式是提供多个工厂方法,分别创建对象.     多个工厂模式关 ...

  4. OJ随笔——【1102-海明距离】——位运算

    题目如下: Description 海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数.比如2转换到3需要翻转1位,所以2到3的海明距离是1.给你两个正整数x和y,(x,y<=1 ...

  5. 10.0.0.55训练赛 Writeup

    From LB@10.0.0.55 Misc 0x01 misc100(图片隐写) 首先用binwalk扫了一下,发现没毛病. 然后就搜了一下jpg的文件尾FFD9,如下图,看到了png格式的标志IH ...

  6. ftk学习记(list篇)

    [声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在開始今天的list主题之前,先看一下icon的执行效果. 今天说的list事实上和这个icon几 ...

  7. POJ 2127 最长公共上升子序列

    动态规划法: #include <iostream> #include <cstdio> #include <fstream> #include <algor ...

  8. xml基本语法(2)

    本节要点: 了解XML的文档声明 了解XML的元素.命名规则.属性.元素内容.处理指令等概念 1 XML文档声明 表示该文档是一个XML文档,以及遵循哪个XML版本的规范. 规范:<?xml 版 ...

  9. 求前n个素数(C++)

    输入一个输n,输出前n个素数. #include<iostream> #include <math.h> using namespace std; class Sushu { ...

  10. Activiti 基本操作之“受理人变量”

    在 Activiti 流程引擎中,尽管通过 setAssignee(taskId, userId) 可以设置受理人,但这毕竟要先把下一步的任务查出来才能设置,比较繁琐:借助 Activiti 的 ac ...