我在理解同步关键字功能时遇到了一些麻烦。
根据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
)上进行同步,因此无效。