是否需要同步ArrayBlockingQueue包装器方法?

时间:2012-02-04 14:15:45

标签: java multithreading

我有两个线程,一个调度消息,另一个调度消息。简单,常见。我使用ArrayBlockingQueue进行同步,但不希望调度程序直接访问worker消息队列 - 我使用了包装器。问题是是否应该将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);
    }
}

1 个答案:

答案 0 :(得分:6)

如果在此方法中只需要一个线程来访问非线程安全共享状态(或者必须在原子上对共享状态进行多次修改),则必须同步putMessage方法。

所有方法都是在ArrayBlockingQueue上调用一个方法,它被精确地设计为由多个线程同时访问。

该方法无需同步。