4

我在理解同步关键字功能方面遇到了一些麻烦。根据 java 文档和其他教程,据说当使用 synchronized 关键字时,两个线程之间不可能在该方法的语句之间交错。

但是,请参阅下面的代码。

public class LockThread implements Runnable {
     String name;
     public LockThread(String name) {
          this.name = name;
     }
     public static void main(String[] args) {
          new Thread(new LockThread("a")).start();
          new Thread(new LockThread("b")).start();
     }
     public void run() {
          locked(Thread.currentThread().getId());


     }

 synchronized void locked(long l) {
      System.out.println(name+"-"+l +  "---> Printed from "   + Thread.currentThread().getName());
      System.out.println(name+"-"+l +  "---> Printed from "   + Thread.currentThread().getName());
 }

}    

根据我的理解,程序输出应该总是以线程 0 和线程 1 不应该交错的方式。但是多次执行这段代码,我得到一个交错的输出。

    使用交错(我期望的输出)
    a-9 ---> 从 Thread-0 打印
    a-9 ---> 从 Thread-0 打印
    b-10 ---> 从 Thread-1 打印
    b-10 ---> 从 Thread-1 打印

没有交错(这是我在上面的相同代码中看到的另一个输出)
    a-9 ---> 从 Thread-0 打印
    b-10 ---> 从 Thread-1 打印
    a-9 ---> 从 Thread-0 打印
    b-10 ---> 从 Thread-1 打印

请帮我理解这个问题..

提前致谢..

4

1 回答 1

5

synchronized关键字防止两个线程运行在同一对象上同步的代码。

您的每个线程都在不同的对象 ( this) 上同步,因此它没有效果。

于 2013-09-22T03:18:05.643 回答