`
sharp-fcc
  • 浏览: 110450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 读写者问题 实现

阅读更多

所谓的读者写者问题是指保证一个Writer进程必须与其他进程互斥地访问共享对象地同步问题.其读写操作限制(包括读者优先和写者优先):

   1)--写互斥,即不能有两个写者同时进行写操作;

   2)--写互斥,即不能同时有一个进程在读而另一个进程在写;

   3)--读允许,即允许同时有多个进程在读同一个对象或文件.

 

package myprojects.rwproblem;
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.util.*;
public class Rwproblem
{
         static final int MAX_THREAD_NUM=64;
         public static void main(String args[])
         {
             char test='0';
             do
             {            
                 System.out.println();
                 System.out.println("----------Demo of Reader and Writer Problem----------");
                 System.out.println("     1:Reader Priority.");
                 System.out.println("     2:Writer Priority.");
                 System.out.println("     3:Exit to Windows.");
                 try
                 {
                    test=(char)System.in.read();
                    System.in.read();
                    }catch(IOException e){}
              }while(test!='3'&&test!='1'&&test!='2');
                        if(test=='3')return;
                              Reader_Writer_Thread [] m_thread;
                              m_thread=new Reader_Writer_Thread[MAX_THREAD_NUM];
                              m_thread[0]=new Reader_Writer_Thread('r',1,3,5);
                              m_thread[1]=new Reader_Writer_Thread('w',2,4,5);
                              m_thread[2]=new Reader_Writer_Thread('r',3,5,2);
                              m_thread[3]=new Reader_Writer_Thread('r',4,6,5);
                              m_thread[4]=new Reader_Writer_Thread('w',5,5.1,3);
                              if(test=='2')
                              {
                                       m_thread[0].setpriority(2);
                                       System.out.println("   Demo of R_W Problem in Writer_Priority:");
                              }
                              else System.out.println("   Demo of R_W Problem in Reader_Priority:");
                              m_thread[0].start();
                     m_thread[1].start();
                     m_thread[2].start();
                     m_thread[3].start();
                     m_thread[4].start();
          }
}
class CriticalOfReader//读者临界区
{
         private int m_critical;
         CriticalOfReader()
         {
                   m_critical=0;
         }
         public synchronized void enterCriticalSection()//进入临界区
         {
                   try
                   {
                    if(m_critical!=0)wait();
                    }catch (InterruptedException e) { }
             m_critical=1;
         }
         public synchronized void leaveCriticalSection()//离开临界区
         {
                   m_critical=0;
                   notify();
         }
}
class CriticalOfWriter//写者临界区
{
         private  int m_critical;
         CriticalOfWriter()
         {
                   m_critical=0;
         }
         public synchronized void enterCriticalSection()//进入临界区
         {
                   try
                   {
                      if(m_critical!=0)wait();
                    }catch (InterruptedException e) { }
             m_critical=1;
         }
         public synchronized void leaveCriticalSection()//离开临界区
         {
                   m_critical=0;
                   notify();
         }
}
class Reader_Writer_Thread extends Thread
{
         static final int PER_SEC_DELAY=1000;//每秒运行数
         private static int m_ipriority;//优先级别(1代表读者优先,2代表写者优先)
         private static CriticalOfWriter m_criticalOfWriter;//写者临界区
         private static CriticalOfReader m_criticalOfReader;//读者临界区
         private static int m_iNumOfWriter;//写者总数
         private static int m_iNumOfReader;//读者总数
         private char m_chEntity;//线程类别
         private int m_iSerial;//序列号
         private double m_dDelay;//延迟时间
         private double m_dPersist;//读持续时间
         static
         {
                   m_ipriority=0;
                   m_iNumOfWriter=0;
                   m_iNumOfReader=0;
                   m_criticalOfWriter=new CriticalOfWriter();
                   m_criticalOfReader=new CriticalOfReader();
         }
         Reader_Writer_Thread(char entity,int serial,double delay,double persist)//构造函数
         {
                   m_chEntity=entity;
                   m_iSerial=serial;
                   m_dDelay=delay;
                   m_dPersist=persist;
         }
         public boolean setpriority(int priority)//设置优先数
         {
                   if(priority==1||priority==2){m_ipriority=priority;return true;}
                   return false;
         }
         public void run()//主运行
         {
                   //区别写者与读者线程
                   if(m_chEntity=='r')reader_run();
                   else if(m_chEntity=='w')writer_run();
         }
         public void reader_run()//读者线程运行函数
         {
                   try
                   {
                            Thread.sleep((long)m_dDelay*PER_SEC_DELAY);
                   }catch(InterruptedException e){}
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Reader thread "+m_iSerial+" sends the reading require.");
                   incNumOfReader();
                   try
                   {
                            sleep((long)m_dPersist*PER_SEC_DELAY);
                   }catch(InterruptedException e){}
                   decNumOfReader();
         }
         public void writer_run()//写者线程线程运行函数
         {
                   try
                   {
                            Thread.sleep((long)m_dDelay*PER_SEC_DELAY);
                   }catch(InterruptedException e){}
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Writer thread "+m_iSerial+" sends the writing require.");
                   incNumOfWriter();
                   try
                   {
                            sleep((long)m_dPersist*PER_SEC_DELAY);
                   }catch(InterruptedException e){}
                   decNumOfWriter();
         }
         public synchronized void incNumOfReader()//互斥
         {
                  
                   //写者优先时,先进入读者临界区
                   if(m_ipriority==2)m_criticalOfReader.enterCriticalSection();
                   //如果是第一个读者,则等待写者写完
                   m_iNumOfReader++;
                   if(m_iNumOfReader==1)m_criticalOfWriter.enterCriticalSection();
                  
                   if(m_ipriority==2)m_criticalOfReader.leaveCriticalSection();//让其他读者进
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Reader thread "+m_iSerial+" begins to read the file!");
         }
         public synchronized void decNumOfReader()//互斥
         {
                   m_iNumOfReader--;
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Reader thread "+m_iSerial+" finished reading the file!");
                   if(m_iNumOfReader==0)m_criticalOfWriter.leaveCriticalSection();//唤醒写者
         }
         public synchronized void incNumOfWriter()//互斥
         {
                   m_iNumOfWriter++;
                   //若是写者优先,第一个写者需等待读者写完
                   if(m_ipriority==2&&m_iNumOfWriter==1)m_criticalOfReader.enterCriticalSection();
                   m_criticalOfWriter.enterCriticalSection();//进入写者临界区
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Writer thread "+m_iSerial+" begins to write to the file!");
         }
         public synchronized void decNumOfWriter()//互斥
         {
                   m_iNumOfWriter--;
                   Date temp=new Date();
                   System.out.print(Integer.toString(temp.getMinutes())+":"
                                         +Integer.toString(temp.getSeconds())+" ");
                   System.out.println("Reader thread "+m_iSerial+" finished writing to the file!");
                   m_criticalOfWriter.leaveCriticalSection();//唤醒等待者(读者写者都有可能)
                   if(m_iNumOfWriter==0&&m_ipriority==2)m_criticalOfReader.leaveCriticalSection();
                   //最后一个写者,唤醒读者
         }
}

 

 

分享到:
评论

相关推荐

    操作系统模拟:读写者问题

    在这个场景中,"读写者问题"的Java实现展示了如何在多线程环境下通过读写锁有效地控制对共享资源的访问,保证数据的一致性和正确性。通过这种方式,我们可以在操作系统层面模拟并发控制,理解读写者问题的解决方案,...

    读写者问题读者优先

    5. **代码实现**:在提供的文件"read_write"中,可能包含了用特定编程语言(如C、C++、Java等)实现的读写者问题解决方案。代码通常会包含读者和写者的类或结构体,以及使用信号量或其他同步原语的逻辑。 解决读写...

    原生JAVA读写PLC

    本教程将聚焦于如何使用原生Java 8来实现对西门子S7系列PLC的读写操作,而无需依赖任何DLL(动态链接库)文件,确保了程序的平台独立性和纯粹性。 首先,我们要理解S7协议。西门子的S7协议是用于其PLC产品通信的一...

    modbus的读写java实现

    ### Modbus的读写Java实现 #### 一、概述 Modbus是一种广泛应用于电子控制器之间进行数据交换的通信协议标准,常用于工业自动化系统中。它支持多种物理层传输模式,如RS-232、RS-485以及TCP/IP网络等。本文将详细...

    java实现modbus读写.pdf

    Java实现Modbus读写 Java实现Modbus读写是指使用Java语言实现对Modbus协议的读写操作。Modbus是一种常用的工业通信协议,广泛应用于工业自动化、过程控制和监控系统中。 Java作为一种功能强大且广泛应用的编程语言...

    java 读写锁代码

    下面我们将详细探讨Java读写锁的概念、实现原理以及如何在实际代码中应用。 1. **读写锁概念**: - 读写锁分为读锁(共享锁)和写锁(独占锁)。读锁允许多个线程同时读取数据,而写锁只允许一个线程进行写操作。 ...

    使用Java实现对dbf文件的简单读写

    使用 Java 实现对 dbf 文件的简单读写 Java 是一种广泛使用的编程语言,对于读写 dbf 文件具有重要的应用价值。本文将介绍使用 Java 实现对 dbf 文件的简单读写,包括读写 dbf 文件的基本步骤、相关类的介绍、代码...

    生产者消费者+读者写者+银行家算法javaGUI实现

    读者写者问题是在生产者消费者问题的基础上改进而来,其不同点仅在于加入一个计数变量count来记录处于读写空间中读者的数量,实现读者可同时读文件。 银行家算法基于安全性算法实现,其目的是避免死锁方法中允许...

    java读写hdf5格式文件需要使用的库

    标题提及的“java读写hdf5格式文件需要使用的库”主要包括两个部分:Java接口库和操作系统特定的动态链接库。这里提供的jar文件`hdf5-3.3.2.jar`是Java接口库,它封装了对HDF5文件的操作,使得Java程序员可以通过...

    多线程模拟读者写者问题,采用读写平等方式

    在实际项目中,Java并发库提供了`java.util.concurrent.locks.ReentrantReadWriteLock`类,它是一个可重入的读写锁,可以更高效地处理读写冲突,但这里我们选择了一个更基础的实现,以便更好地理解读者写者问题的...

    java实现文件的读写操作

    本篇将详细介绍如何在Java中实现文件的读写操作,并通过一个小例子帮助大家理解和实践。 一、Java中的文件操作基础 在Java中,`java.io`包提供了丰富的类和接口来支持文件操作,如`File`、`FileReader`、`...

    关于读写锁算法的Java实现及思考

    关于读写锁算法的Java实现及思考,是一个深入探讨了多线程环境下资源访问控制机制的主题。在现代软件开发中,尤其是并发编程领域,读写锁(ReadWriteLock)是一种非常重要的同步工具,它允许多个线程同时进行读操作...

    Java 读写锁实现原理浅析

    "Java 读写锁实现原理浅析" Java 读写锁实现原理浅析是 Java 并发编程中一个非常重要的主题。在多线程编程中,读写锁是解决读写并发问题的常用机制。本文主要介绍了 Java 读写锁实现原理浅析,包括读写锁的定义、...

    Java 读写Ini文件

    以上就是使用Java读写Ini文件的基本方法。在实际项目中,你可能需要根据具体需求进行调整,比如处理异常、文件不存在的情况,或者在读写操作前后进行备份等。确保始终处理好错误和异常,以提高代码的健壮性。

    RFID读写器开发指南-Java1

    通过本指南,你可以了解RFID读写的基本原理,以及如何使用Java实现RFID系统的功能。 1.1. 概述 RFID系统通常由RFID标签、阅读器(读写器)和后台管理系统三部分组成。Java以其跨平台性和丰富的库支持,成为开发RFID...

    java读写Modbus RTU数据,java串口modbus通信,Modbus RTU与java通信 全开源

    最近在研究处理java写modbus RTU通信,分别使用几套工具,模拟modbus从站、模拟串口等才能正常在电脑测试成功。 全开源,放心下载 可以查看运行内容https://blog.csdn.net/weijia3624/article/details/121216539

    java 实现word文档的读写编辑

    本人编写的用java 实现对word文档的新建,打开,写入保存。需要包含poi外包实现。

    JAVA简单的读写文本文件的代码

    通过上述四个主要部分的分析,我们可以看到Java语言在处理文件读写方面提供了丰富的API支持。使用合适的类库可以极大地简化开发工作并提高程序的性能。例如,使用`StringBuffer`可以有效地处理字符串的动态增长;而`...

Global site tag (gtag.js) - Google Analytics