Java Threading Primitives を使用してスレッド セーフの境界付きキューを構築する場合 - これら 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();
}
}
ノート
- これは制限付きリストです
- エンキューとデキュー以外の操作は実行されていません。
- ブロッキング キューを使用することもできますが、この質問は、スレッドに関する私の限られた知識を改善するためのものです。
- この質問が繰り返される場合は、お知らせください。