java线程信令

时间:2012-12-16 02:28:13

标签: java synchronized

尝试在2个线程之间发出信号,浪费的信号最少。 由于我已经尝试了一段时间 - 请提出错误/改进(如果有的话)。 目的是: 没有死锁 2.没有被阅读错过的更新 3.尽量不要提高错过的信号。

import java.util.Random;
class shareful{

    class share{
        int sharedata;
        volatile boolean  isbitset=false;
        public int getstats(){
            return sharedata;
        }
        public void setstats(int data){
            sharedata=data;
        }

        public boolean getbitset(){ return isbitset;}
        public void setbitset(boolean flag){ isbitset=flag;}
    }
    share so=new share();
    void runStatistics(){
        int check=0;
        Thread t1=new Thread(new Runnable(){
            public void run(){
                Random r=new Random();
                boolean isflagged=false;
                while (true){
                    synchronized(so){
                        try{
                            while(so.getbitset()==true){
                                        so.wait();
                            }
                        }
                        catch(InterruptedException e){}
                        so.setstats(r.nextInt(200));
                        if(so.getbitset()==false) isflagged=true;
                        so.setbitset(true);
                        if(isflagged) so.notify();

                    }
                }


            }
        });

        Thread t2=new Thread(new Runnable(){
            public void run(){
                boolean isflagged=false;
                while(true){
                    synchronized(so){
                            try{
                                    while(so.getbitset()==false){
                                    so.wait();
                                }
                            }
                            catch(InterruptedException e){}
                            int curr=so.getstats();
                            if(so.getbitset()==true) isflagged=true;
                            so.setbitset(false);
                            if(isflagged) so.notify();
                    }

                }
            }
        });

        t1.start();
        t2.start(); 


    }

    public static void main(String[] args){
        shareful s=new shareful();
        s.runStatistics();
    }


}

1 个答案:

答案 0 :(得分:1)

有效性的建议(或反向健全,取决于您的观点):

  1. 停止尝试手动管理线程,而是使用经过验证的范例来管理并发性,如演员或软件事务内存,具体取决于您的需求。
  2. 处理并发时不要使用可变状态。
  3. 如果必须使用可变状态,至少不要使用任何共享的可变状态。
  4. 其他建议:阅读Brian Goetz的“Java Concurrency in Practice”,发现在特定应用程序中不应尝试在此级别编写代码。