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

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

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 --->从线程1打印
b-10 --->从线程1打印

没有交织(这是上面相同代码的另一个输出)
a-9 --->从Thread-0打印
b-10 --->从线程1打印
a-9 --->从Thread-0打印
b-10 --->从线程1打印

请帮助我理解问题。

提前致谢..

最佳答案

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

您的每个线程都在不同的对象(this)上进行同步,因此无效。

09-05 08:32