0

まだ受信されていない番号のみを出力するメソッドを使用してオブジェクトを作成したいので、次のコードを使用しました。アイデアは、整数ごとに lock を格納するマップを使用し、スレッドが既にマップにある場合はロックを待機し、そうでない場合は、その整数をキーとしてIntegerオブジェクトをマップに新しいロックを配置します。価値、

注:Integer(a)整数のロックとして使用しますa

問題は、マップのロックを解除したいことと、マップから取得されたロックを待ちたいことですがrace condition、問題を解決するためのアイデアはありますか?

public class sync_print {
    public static void main(String[] args) {
        sync_print syobj = new sync_print();
        Thread t1 = new Thread(new worker(syobj, 10) , "thread 1");
        Thread t2 = new Thread(new worker(syobj, 10) , "thread 2");
        Thread t3 = new Thread(new worker(syobj, 4) , "thread 3");
        Thread t4 = new Thread(new worker(syobj, 5) , "thread 4");
        Thread t5 = new Thread(new worker(syobj, 5) , "thread 5");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }


    HashMap<Integer, Integer> lock_map = new HashMap<Integer , Integer>();
    void print(int a) throws InterruptedException{
        synchronized(lock_map){
            Integer lock = lock_map.get(a);
            if (lock != null){
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + " is waiting");
                    lock_map.notify();
                    lock.wait();
                }
            }else{
                lock_map.put(a, new Integer(a));
                System.out.println(a);
            }
        }
    }
}

class worker implements Runnable{
    int val;
    sync_print obj;
    public worker(sync_print obj , int v){
        this.val = v;
        this.obj = obj;
    }
    public void run() {
        try {
            obj.print(val);
        } catch (InterruptedException e) {}
    }
}
4

2 に答える 2

0

あなたwaitはループの中にいません。それが問題を引き起こす理由については、の場所を参照してください。

于 2013-06-21T18:55:40.853 に答える