这个问题是关于这个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}}
答案 0 :(得分:1)
假设第二个线程同时启动,那么下面的例子我会遇到什么问题吗?
可能,是的,你会的。重读我对上一个问题的回答中的第二个要点。
基本上,问题是线程将在Task
类的不同实例上进行同步...并且不会提供任何互斥。
这是否实际问题取决于线程是否需要进行同步。在这种情况下,线程似乎将共享Service
和BlockingQueue
个实例。如果这是他们共享的程度并且您使用的是线程安全的实现类,则不需要同步 。
我给你的建议是回到你的Java教科书/教程,并回顾一下他们对synchronized
和原始互斥实际做什么的看法。它们非常简单......但是你需要完全理解这些原语才能将它们正确地组合在一起,以达到你想要达到的目标。