为什么QueueScheduler的pushWhenNoDuplicate()没有加synchronized呢 #410

Open
zhongshan365 opened this Issue Dec 6, 2016 · 2 comments

Projects

None yet

2 participants

@zhongshan365

本人刚开始研究没多久,希望不吝赐教。

QueueScheduler组合了BlockingQueue阻塞队列,但是并没有用到阻塞队列的功能,而只是用来简单的add()和poll()方法。
调用poll方法加了synchronized,为什么调用add方法却没有使用同步呢?请求队列多个线程都会往里添加,为什么不需要同步?

`public class QueueScheduler extends DuplicateRemovedScheduler implements MonitorableScheduler {

private BlockingQueue<Request> queue = new LinkedBlockingQueue<Request>();
@Override
public void pushWhenNoDuplicate(Request request, Task task) {
    queue.add(request);//为什么没有加同步synchronized?
}

@Override
public synchronized Request poll(Task task) {//这里加了synchronized
    return queue.poll();
}

@Override
public int getLeftRequestsCount(Task task) {
    return queue.size();
}

@Override
public int getTotalRequestsCount(Task task) {
    return getDuplicateRemover().getTotalRequestsCount(task);
}

}`

@code4craft code4craft added this to the WebMagic-0.6.0 milestone Dec 7, 2016
@code4craft
Owner
code4craft commented Dec 7, 2016 edited

好问题,看代码这里的push应该是漏了。因为DuplicateRemover其实是不保证线程安全的,所以push应该是必须同步的。而poll的时候,其实BlockingQueue本身是线程安全的,反而就无所谓了。

当然更好的方式是:哪个组件不是线程安全的,就自己去加锁。这两个synchronized应该都可以去掉。

@zhongshan365

谢谢您的解答。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment