final public class ExampleClass {
final public class OperationQueue {
final private ConcurrentLinkedQueue<Operation> queue = new ConcurrentLinkedQueue<>();
public Operation newOp(Command command) {
Operation op = new Operation(command);
queue.add(op);
return op;
}
private boolean isEmpty() {
return queue.isEmpty();
}
private Operation remove() {
return queue.remove();
}
}
final public OperationQueue opQueue = new OperationQueue();
public void doSomething() {
synchronized (opQueue.queue) { // or synchronized(opQueue) ?
while (!opQueue.isEmpty()) {
process(opQueue.remove());
}
}
}
}
我需要同步什么? opQueue.queue
?还是opQueue
?或者没关系?
实际上opQueue.queue
只能通过它inner/nested class
中的怪癖来访问。
答案 0 :(得分:2)
在你的情况下做poll()
可能更好
public void doSomething()
{
Operation op;
while( null != (op=queue.poll()) )
process( op );
}
答案 1 :(得分:1)
你锁定哪个对象并不重要,但是它应该是相关的。
您唯一需要注意的是,对于您要保护的共享资源上的其他操作,应使用相同的锁。