用JAVA实现的第二类读者写者问题

//--Semaphore.java
package rw;

public class Semaphore {
	private int value;//记录希望访问临界资源的线程的计数器个数
	
	public Semaphore(int i)
	{
		this.value=i;
	}
	
	public synchronized void P()
	{
		value--;
		if(value<0)
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
				Thread.currentThread().interrupt();
			}
	}

	public synchronized void V()
	{
		value++;
		if(value<=0)
		{
			notifyAll();
		}
	}
}

//------------------------------文件2  ReaderWriter.java------------------------------------------------
package rw;

import java.io.FileNotFoundException;
import java.io.PrintStream;

public class ReaderWriter extends Thread{

	String msg;
	int NO;
	final int N=100;
	static public int num=0;
	static public int readers=0;
	static public int writers=0;
	final static public String base="Last Writer:";
	static public String resource=base+"0";
	static Semaphore mutexr=new Semaphore(1);
	static Semaphore mutexw=new Semaphore(1);
	
	static Semaphore mutex=new Semaphore(1);
	
	static Semaphore mutexWrite=new Semaphore(1);
	
	public ReaderWriter()
	{
		NO=num++;
		if(NO%N!=1)
		    msg="I am reader @"+NO;
		else 
			msg="I am writer @"+NO;
	}
	
	public void read()
	{
		if(writers!=0)//如果有写者,阻塞,并且后续的读者不许进来
			mutex.P();
		mutexr.P();
		readers++;
		if(readers==1)//保证当读的时候,对写互斥,写者等待
			mutexWrite.P();
		mutexr.V();
		
		//.............................................读开始...
		System.out.println("      "+NO+" is reading, resource=" +resource);
		//.............................................读结束...
		
		mutexr.P();
		readers--;
		if(readers==0)
			mutexWrite.V();
		mutexr.V();
		if(writers!=0)//如果有写者,阻塞,并且后续的读者不许进来
			mutex.V();
	}
	
	public void write()
	{
		
		mutexw.P();
		writers++;
		if(writers==1)
			mutex.P();
		mutexw.V();
		
		//.....................................................写开始
        mutexWrite.P();
		resource="base"+NO;
		System.out.println(NO+" IS WRITING, resource=" +resource);
		mutexWrite.V();
		//.....................................................写结束
		
		mutexw.P();
		writers--;
		if(writers==0)
			mutex.V();
		mutexw.V();
	}
	
	public void run()
	{
		int n=1000;
		while(n-->0)
		{
			if(NO%N!=1)
			{/*
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				*/
				read();
			}
			else 
			{
				write();
				/*
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				*/
			}
		}
	}
	
	public static void main(String args[])
	{
		PrintStream ps;
		try {
			ps = new PrintStream("D:\\readerWriter.txt");
			System.setOut(ps);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		for(int i=0;i<1000;i++)
		{
			new ReaderWriter().start();
		}
	}
}






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面为你提供一个简单的测试代码: ```java public class TestReaderWriter { public static void main(String[] args) { ReaderWriter rw = new ReaderWriter(); // 启动 3 个读者进程 for (int i = 0; i < 3; i++) { new Thread(() -> { try { rw.startReading(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } // 启动 2 个写者进程 for (int i = 0; i < 2; i++) { new Thread(() -> { try { rw.startWriting(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } } } ``` 上述代码中,我们创建了一个 `ReaderWriter` 对象 `rw`,并分别启动了 3 个读者进程和 2 个写者进程。读者进程通过调用 `rw.startReading()` 方法读取共享资源,写者进程通过调用 `rw.startWriting()` 方法写入共享资源。 需要注意的是,由于多线程的执行是不可预测的,因此每次执行的结果可能会不同。为了更好地测试程序的正确性,需要多次运行程序并观察输出结果。 下面是一个简单的输出结果示例: ``` Reading... Reading... Writing... Reading... Writing... ``` 上述输出结果表明,第一个写者进程成功获取了写者信号量,执行了写操作,然后第一个读者进程获取了互斥信号量,执行了读操作,接着第二个读者进程也获取了互斥信号量,执行了读操作,然后第二个写者进程尝试获取写者信号量,但由于之前的读者进程还没有全部离开临界区,因此无法获取该信号量,只能等待。最后,第一个读者进程离开了临界区,释放了写者信号量,第二个写者进程立即获取到了该信号量,执行了写操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值