我会解释这些不同的含义:
首先:
public void foo(Object key){
synchronized (map.get(key)) { //-> thread can enter with different key
int variable = 0;
for (int j = 0; j <new Random().nextInt(10); j++)
variable+=j;
return variable;
}
}
第二
public void foo(Object key){
int variable = 0;
synchronized (map.get(key)) {
for (int j = 0; j < new Random().nextInt(10); j++)
variable+=j;
return variable;
}
}
第三
public void foo(Object key){
int variable = 0;
synchronized (map.get(key)) {
for (int j = 0; j <new Random().nextInt(10); j++)
variable+=j;
lock.lock(); // class instance lock
try{
setTheVariable(variable) //-> Example.....
}finally{
lock.unlock();
}
return variable;
}
}
在我看来,前两个实现是相同的,如果每个线程进入syncrhonized
block
他们共享for loop
但是他们有自己的variable
复制,是对吗?
我对第三个实现有疑问,如果每个线程进入syncrhonzized block
,完成后只有一个可以进入lock block
,另一个必须等待。 在这种情况下,当一个帖子可以返回 时,for loop
生成的每个变量仍然附加在他自己的thread
上?
提前感谢。
答案 0 :(得分:1)
您的前两个实现是相同的。
在你的第三个实现中,只有一个线程可以进入同步块,无论它是否是一个类实例变量,所以lock
在某种程度上是多余的,除非你的//Do Something Here
部分有令人信服的理由这样做。
因为涉及的所有变量都是局部变量,所以每个线程都有自己的这些变量的副本。一个线程的返回值不会受到另一个线程的影响。
但是,如果以这种方式使用两个锁,请始终注意死锁。
答案 1 :(得分:1)
在foo()方法中声明的变量仍然附加到各个线程,因为它们是局部变量。在这里,您在方法中声明“j”和“variable”,这些变量将保持附加到执行该方法的线程。