2

マルチスレッド プログラムを作成していて、ネストされた同期ブロックを持つメソッドがあり、内部同期が必要なのか、それとも外部同期だけで十分なのか疑問に思っていました。

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

4

2 に答える 2