run方法之外的同步方法

时间:2012-08-21 01:49:24

标签: java multithreading

这个问题是关于这个Question的后续问题,类似的问题但执行情况不同,如下面的代码所示,我对该对象没有任何锁定。所以试图清楚地理解,我是对还是不对。

到目前为止,我通过阅读书籍和文章了解到: -

每个帖子都会输入run method,并根据id from the various pool (existPool or newPool)获得if, else if block,然后它会进入attributeMethod,而synchronized必须是attributeMethod对?还有另一种方法private static final class Task implements Runnable { private BlockingQueue<Integer> existPool; private BlockingQueue<Integer> newPool; private int existId; private int newId; private Service service; public Task(Service service, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) { this.service = service; this.existPool = pool1; this.newPool = pool2; } public void run() { if(service.getCriteria.equals("Previous")) { existId = existPool.take(); attributeMethod(existId); } else if(service.getCriteria.equals("New")) { newId = newPool.take(); attributeMethod(newId); } } } // So I need to make this method synchronized or not? Currently I have made this synchronized private synchronized void attributeMethod(int range) { // And suppose If I am calling any other method here- sampleMethod(); } // What about this method, I don't thinkg so, it will be synchronized as well as it will be in the scope of previous synchronized method whoever is calling, Right? or not? private void sampleMethod() { } 不需要同步吗?

假设第二个线程同时启动,那么下面的例子我会遇到什么问题吗?

{{1}}

1 个答案:

答案 0 :(得分:1)

  

假设第二个线程同时启动,那么下面的例子我会遇到什么问题吗?

可能,是的,你会的。重读我对上一个问题的回答中的第二个要点。

基本上,问题是线程将在Task类的不同实例上进行同步...并且不会提供任何互斥。

这是否实际问题取决于线程是否需要进行同步。在这种情况下,线程似乎将共享ServiceBlockingQueue个实例。如果这是他们共享的程度并且您使用的是线程安全的实现类,则不需要同步


我给你的建议是回到你的Java教科书/教程,并回顾一下他们对synchronized和原始互斥实际做什么的看法。它们非常简单......但是你需要完全理解这些原语才能将它们正确地组合在一起,以达到你想要达到的目标。