我有两个线程,一个调度消息,另一个调度消息。简单,常见。我使用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);
}
}
答案 0 :(得分:6)
如果在此方法中只需要一个线程来访问非线程安全共享状态(或者必须在原子上对共享状态进行多次修改),则必须同步putMessage
方法。
所有方法都是在ArrayBlockingQueue
上调用一个方法,它被精确地设计为由多个线程同时访问。
该方法无需同步。