gpt4 book ai didi

java - 同步块(synchronized block)实现上的差异

转载 作者:行者123 更新时间:2023-12-02 05:18:28 24 4
gpt4 key购买 nike

我想对这些不同的实现进行解释:

第一:

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循环但他们有自己的变量副本,对吗?

  • 我对第三种实现有疑问,如果每个线程都进入syncrhonzized block ,完成后只有一个可以进入lock block ,另一个线程可以进入lock block 内部必须等待。 在这种情况下,当一个线程可以返回时,for 循环产生的每个变量仍然附加在他自己的线程上?

提前致谢。

最佳答案

在 foo() 方法中声明的变量仍然附加到各个线程,因为它们是局部变量。在这里,您在方法内声明“j”和“变量”,这些变量将保留附加到执行该方法的线程。

关于java - 同步块(synchronized block)实现上的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26704002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com