实验存档。

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

读者.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. 为Spark Application指定不同的JDK版本

    随着企业内部业务系统越来越多,基于JVM的服务,通常情况线上环境可能会有多套JDK跑不同的服务.大家都知道基于高版本的Java规范编写的服务跑在低版本的JVM上会出现:java.lang.Unsupp ...

  2. cardview和Palette,ActionBar颜色随图改变

    CardView是一个控件,Palette是取色工具(工具类),本文会对他们进行比较细致的介绍,相信机制的各位看完一定轻而易举地实现ActionBar随图改变的特效. 首先看一下效果图: Gradle ...

  3. 学习笔记:UITabBarController使用详解

    一.手动创建UITabBarController 最常见的创建UITabBarController的地方就是在application delegate中的 applicationDidFinishLa ...

  4. Laravel 框架安装

    Composer 在命令行执行 create-project 来安装 Laravel:就是下面这一句话就OK了!composer create-project laravel/laravel --pr ...

  5. VSCode插件及用户设置

    第一部分:插件 VSCode内置"emmet"插件,"convert to utf-8"等插件效果!十分强大!代码提示功能特别强悍! 插件地址:点击此处! 推荐 ...

  6. js图片懒加载(滚动加载)是否生效

    一.什么是懒加载? 对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载. 二.为什么使用懒加载? 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 理论性知识大家都有自 ...

  7. Oracle查看对象空间使用情况show_space

    tom大神写了一个用于查看Oracle数据库对象空间使用情况. 以下演示一下怎样使用: –工具源代码 CREATE OR REPLACE PROCEDURE show_space(p_segname ...

  8. 【Notification】屏蔽特定应用的通知提示

    须要默认屏蔽特定app的通知提示 设置app是否接收通知的界面 点击每一个条目进去的界面 AppNotificationSettings extends SettingsPreferenceFragm ...

  9. WAS集群系列(2):数据库连接低级错误——网络连接问题

    环境 项目点 指标 WAS版本号 7.0 应用server操作系统 Windows 2008 应用server系统位数 64bit 数据库server操作系统 CentOS 5.6 数据库版本号 Or ...

  10. 【leetcode】123. Best Time to Buy and Sell Stock III

    @requires_authorization @author johnsondu @create_time 2015.7.22 19:04 @url [Best Time to Buy and Se ...