2017-02-14 71 views
0

伯爵“这个” elasped时间下同步的增量方法是:20000经过时间:5001两个线程调用比预期

我得到这样的结果,当我键入下面的代码,我有一个具有计数的类变量在“this”的同步块中增加,为什么当我在main中创建一个新的Exercise对象,然后2个线程使用2 anon runnable的调用ex.increment时,它只需要5秒?不应该总共为10秒,因为一个线程获得一个锁并且它在另一个应该等待的时候工作吗?我得到同步的想法,但我只是困惑,为什么如果我要使练习实现可运行并将其传递给Thread()构造函数,它将需要10秒,但不是这样,请解释谢谢。

public class Exercise { 
    private int count = 0; 

    public int getCount() { 
     return count; 
    } 

    public void increment() { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     synchronized (this) { 
      for (int i = 0; i < 10000; i++) { 
       count++; 
      } 
     } 
    } 
} 

public class App { 
    public static void main(String[] args) { 
     Exercise ex = new Exercise(); 

     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       ex.increment(); 
      } 
     }); 

     Thread t2 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       ex.increment(); 
      } 
     }); 

     long start = System.currentTimeMillis(); 

     t1.start(); 
     t2.start(); 

     try { 
      t1.join(); 
      t2.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     long end = System.currentTimeMillis(); 

     System.out.println("Count is: " + ex.getCount() + " Time elapsed: " + (end - start)); 
    } 
} 
+0

_When_是获得的锁吗?睡觉之前或之后?换句话说,睡眠呼叫是并行执行还是一个接一个地执行? –

+0

等待,所以你说的是方法同时睡5秒,而同步的块实际上是在5秒之外连续执行的。 – Calyxander

+0

他们有什么理由等待彼此? –

回答

1

两个线程几乎平行睡5秒。

然后一些线程进入同步块并立即运行循环。然后另一个线程也一样。

在这里没有什么奇怪的。