Java 多线性读者写者问题
Java 多线性读者写者问题
Java 多线性读者写者问题
- package namespace;
- class Man
- {
- String name;
- String sex;
- boolean flag=false;// 定义一个开关变量,用来进行读或写的操作
- }
- class Input implements Runnable
- {
- private Man man;
- private static int num=1;//用于控制两次写进去的值不一样
- public Input(Man m)
- {
- this.man=m;
- }
- public void run()
- {
- while(true)
- {
- synchronized(man) {
- if(man.flag)//如果flag=true的话,就代表已经写进去值了,所以就要等待
- try { man.wait();}catch(Exception e) {}
- if(num==1)//等待被唤醒之后,下面就要对其进行写的操作了
- {
- man.name="mike";
- man.sex="男";
- }else {
- man.name="Lily";
- man.sex="女";
- }
- //上面是已经执行完写的动作
- man.flag=true;//写完之后,要把flag设置成true ,这代表已经写完,等被读,如果再执行写操作的话,上面flag=true ,就开始了等待了
- num=(num+1)%2;
- man.notify();//
- }
- }
- }
- }
- class Output implements Runnable
- {
- private Man man;
- public Output(Man m)
- {
- this.man=m;
- }
- public void run()
- {
- while(true)
- {
- synchronized(man)
- {
- if(!man.flag)
- try { man.wait();}catch(Exception e) {}
- System.out.println(man.name+"...."+man.sex);
- man.flag=false;
- man.notify();
- }
- }
- }
- }
- public class Study
- {
- public static void main(String args[])
- {
- Man man=new Man();
- Thread t1=new Thread(new Input(man));
- Thread t2=new Thread(new Output(man));
- t1.start();
- t2.start();
- }
- }
- /*
- * 多线程读者写者问题
- * 线程之间的通信一般都是一段共享数据的操作来进行通信的
- *
- * 里面的两个线程就是一个读一个写,然而这两个操作是通过两个线程同时进行的.因此如果线程不同步,将会出现安全性问题
- * 所谓的安全性问题就是线和写和线和读的结果不一样,出就是读出来的值并不是写进行的那样,这样就出来了安全性问题
- *问题的解决:
- * 出现这种同时操作一个对象的问题,就是把它们操作那个对象的代码进行同步
- * 读者与写者的问题要考虑到两个方面:
- * 1. 读和写的两个线程要同步
- * 2. 读和写要写进去一个就读一个
- *
- *
- *
- * */
- /* 2011/10/23 21:22:20
- * */
评论暂时关闭