同步块实现中的差异

时间:2014-11-02 20:26:24

标签: java multithreading synchronization

我会解释这些不同的含义:

首先:

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上?

提前感谢。

2 个答案:

答案 0 :(得分:1)

您的前两个实现是相同的。

在你的第三个实现中,只有一个线程可以进入同步块,无论它是否是一个类实例变量,所以lock在某种程度上是多余的,除非你的//Do Something Here部分有令人信服的理由这样做。

因为涉及的所有变量都是局部变量,所以每个线程都有自己的这些变量的副本。一个线程的返回值不会受到另一个线程的影响。

但是,如果以这种方式使用两个锁,请始终注意死锁。

答案 1 :(得分:1)

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