我在理解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 …