マルチスレッド プログラムを作成していて、ネストされた同期ブロックを持つメソッドがあり、内部同期が必要なのか、それとも外部同期だけで十分なのか疑問に思っていました。
public class Tester {
private BlockingQueue<Ticket> q = new LinkedBlockingQueue<>();
private ArrayList<Long> list = new ArrayList<>();
public void acceptTicket(Ticket p) {
try {
synchronized (q) {
q.put(p);
synchronized (list) {
if (list.size() < 5) {
list.add(p.getSize());
} else {
list.remove(0);
list.add(p.getSize());
}
}
}
} catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
編集:私はまだ取り組んでいるので、これは完全なクラスではありません。しかし、基本的には券売機をエミュレートしようとしています。BlockingQueue
券売機は、 qにチケットのリストを保持します。ArrayList
クライアントがマシンにチケットを追加するたびに、マシンは最新の 5 つのチケット (リスト)の価格も追跡します。したがって、内部同期が必要だとは思わない。list