4

Java Threading Primitives を使用してスレッド セーフの境界付きキューを構築する場合 - これら 2 つの構造の違いは何ですか

  1. 明示的なロック オブジェクトの作成。
  2. リストをロックとして使用し、それを待機します。

1の例

private final Object lock = new Object();
private ArrayList<String> list = new ArrayList<String>();

public String dequeue() {
    synchronized (lock) {
        while (list.size() == 0) {
            lock.wait();
        }

        String value = list.remove(0);
        lock.notifyAll();
        return value;
    }
}    

public void enqueue(String value) {
    synchronized (lock) {
        while (list.size() == maxSize) {
            lock.wait();
        }

        list.add(value);
        lock.notifyAll();
    }
}

2の例

private ArrayList<String> list = new ArrayList<String>();

public String dequeue() {
    synchronized (list) {  // lock on list
        while (list.size() == 0) {
           list.wait();     // wait on list
        }

        String value = list.remove(0);
        list.notifyAll();  
        return value;
    }
}


public void enqueue(String value) {
    synchronized (list) {  // lock on list
        while (list.size() == maxSize) {
           list.wait();   // wait on list
        }

        list.add(value);
        list.notifyAll();
    }
}

ノート

  1. これは制限付きリストです
  2. エンキューとデキュー以外の操作は実行されていません。
  3. ブロッキング キューを使用することもできますが、この質問は、スレッドに関する私の限られた知識を改善するためのものです。
  4. この質問が繰り返される場合は、お知らせください。
4

1 に答える 1