java中的“隐式”同步?

时间:2010-08-19 09:14:36

标签: java synchronization

当我有像

这样的方法时
public void unsynchronizedMethod(){
  callSynchronizedMethod();
  //dosomestuff after this line
}

是否意味着在unynchronizedMethod() - Method中调用callSynchronizedMethod()后,所有内容都是隐式同步的?

4 个答案:

答案 0 :(得分:6)

没有。锁定在callSynchronizedMethod()结束时释放。

答案 1 :(得分:3)

以直接的方式定义同步:

  • 对于synchronized方法:在该方法的执行中
  • 对于synchronized块:在该块的执行中

以下是 Java语言规范第3版的相关摘录:

JLS 14.19 The synchronized Statement

  

synchronized声明:

     
      
  1. 代表执行线程
  2. 获取互斥锁   
  3. 执行一个块,
  4.   
  5. 然后释放锁。
  6.         

    当执行线程拥有锁时,没有其他线程可以获取锁。

synchronized方法在语义上与应用于整个方法的synchronized语句相同(§JLS 8.4.3.6。锁是从this获得的(如果它是实例方法)或者与方法类相关联的Class对象(如果它是static方法;您不能在this上下文中引用static

所以回答原来的问题,给出了这个片段:

public void unsynchronizedMethod(){
  callSynchronizedMethod();

  doSomeUnsynchronizedStuff(); // no "implicit synchronization" here
}

请注意,这是设计使然:您应始终尽量将同步最小化到关键部分。在这些关键部分之外,早期同步不会产生挥之不去的影响。

另见

  • Effective Java 2nd Edition,Item 67:避免过度同步

相关问题

答案 2 :(得分:0)

不,不是。

同步意味着一次只有一个线程会执行代码。

但在callSynchronizedMethod()之后,线程可以以不同的顺序在代码上再次运行,同时全部在同一时间。

答案 3 :(得分:0)

不,不会有隐式同步。同步在块或函数范围内工作。同步块之外的任何内容都不会同步。

以下示例代码显示了这一点。如果同步的方法总是打印0。

class example extends Thread{
   //Global value updated by the example threads
   public static volatile int value= 0;
    public void run(){
    while(true)//run forever
       unsynchMethod();

   }
   public void unsynchMethod(){
     synchronizedMethod();
    //Count value up and then back down to 0
    for(int i =0; i < 20000;++i)
       value++;//reads increments and updates value (3 steps)
    for(int i = 0; i < 20000;++i)
       value--;//reads decrements and updates value (3 steps)
      //Print value 
      System.out.println(value);
   }
   //Classlevel synchronized function
   public static synchronized void synchronizedMethod(){
      //not important
   }
   public static void main(String... args){
    example a = new example();
    example b = new example();
    a.start();
    b.start();
   }

}

我的结果,如果同步则应为0:

4463
6539
-313
-2401
-3012
...