语句执行交错与同步方法执行

rak*_*pan 4 java multithreading synchronized

我在理解synchronized关键字功能方面遇到了一些麻烦.根据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());
 }

}    
Run Code Online (Sandbox Code Playgroud)

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

    With interleaving (Output I expect)
    a-9 ---> Printed from Thread-0
    a-9 ---> Printed from Thread-0
    b-10 ---> Printed from Thread-1
    b-10 ---> Printed from Thread-1

Without Interleaving (This is one another output I see for the same code above)
    a-9 ---> Printed from Thread-0
    b-10 ---> Printed from Thread-1
    a-9 ---> Printed from Thread-0
    b-10 ---> Printed from Thread-1

请帮我理解这个问题..

提前致谢..

SLa*_*aks 5

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

每个线程都在不同的对象(this)上进行同步,因此它没有任何效果.