2017-01-04 18 views
0

在代码中,线程输出未正确同步。输出应该是按升序排列的数字。java中的同步输出不正确

这里是代码

public class Prog { 

    public static void main(String[] args) { 
     Thread a = new Thread(new Writer(), "A"); 
     Thread b = new Thread(new Writer(), "B"); 
     Thread c = new Thread(new Writer(), "C"); 
     a.start(); 
     b.start(); 
     c.start(); 
    } 

    static class Writer implements Runnable { 

     private static int count; 

     @Override 
     public void run() { 
      while (count < 5) { 
       show(); 
      } 
      try { 
       Thread.sleep(200); 
      } catch (InterruptedException ex) { 
      } 
     } 

     private synchronized void show() { 
      System.out.println(Thread.currentThread().getName() + ":\t" + ++count); 
     } 
    } 
} 
这段代码的

一个输出是:

B: 2 
B: 4 
C: 3 
A: 2 
B: 5 

,而预期输出是:

B: 1 
B: 2 
C: 3 
A: 4 
B: 5 

我错过了什么?请帮忙。

回答

1

每个Writer都自己同步(隐式) - 所以你有三个写入者和三个单独的锁(它们之间不会发生真正的同步)。

如果更改show方法静态的,作家将在Writer类,而不是同步的 - 这种方式,所有的作家将共享锁,可以相互同步。

+0

这工作!你能详细解释我的错误吗?谢谢。 – Doc

+0

你大概知道Java同步是如何工作的吗?我不知道哪些部分需要更深入的解释。 – fdreger

+0

好吧,我需要阅读更多关于此...感谢代码。 – Doc