我在这里同步什么?

时间:2015-10-20 23:33:22

标签: java multithreading synchronization

代码碎片首先......

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中的怪癖来访问。

2 个答案:

答案 0 :(得分:2)

在你的情况下做poll()可能更好

public void doSomething() 
{
    Operation op;
    while( null != (op=queue.poll()) )
        process( op );
}

答案 1 :(得分:1)

你锁定哪个对象并不重要,但是它应该是相关的。

您唯一需要注意的是,对于您要保护的共享资源上的其他操作,应使用相同的锁。