数组阻塞队列的包装方法需要同步吗?

4

我有两个线程,一个负责派发消息,另一个负责解析它们。这是一种简单、常见的情况。我使用 ArrayBlockingQueue 进行同步,但不希望派发器直接访问工作者的消息队列 - 所以我使用了一个包装器。问题在于是否应该声明 setter 方法为 synchronized

public class Worker implements Runnable{
    protected final ArrayBlockingQueue<ByteBuffer> messages = new ArrayBlockingQueue<ByteBuffer>(16);

    public synchronized void putMessage(ByteBuffer msg) throws InterruptedException{
        messages.put(ByteBuffer);
    }
}

设置器在哪里?是putMessage()吗?那么它不是一个设置器。 - JB Nizet
哦,那个。我会编辑问题的。 - gcasar
@MozenRath 队列对象是final的,它不会改变。但它的内容可以:) - gcasar
1个回答

6
putMessage方法只有在需要访问非线程安全共享状态(或需要原子地对共享状态进行多个修改)时,才需要进行同步。
该方法仅仅是调用一个ArrayBlockingQueue上的方法,而ArrayBlockingQueue被设计成可以被多个线程并发访问。
因此,该方法不需要进行同步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接