我试图理解多线程的一个例子:
class Callme {
void call(String msg) {
System.out.print(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
}
}
class Caller implements Runnable {
String msg;
Callme target;
void call(String msg) {
System.out.println(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
}
public Caller(Callme target, String msg) {
this.target = target;
this.msg = msg;
new Thread(this).start();
}
public void run() {
synchronized (target) {
target.call(msg);
}
}
}
public class Main {
public static void main(String args[]) {
Callme target = new Callme();
new Caller(target, "1");
new Caller(target, "2");
new Caller(target, "3");
new Caller(target, "4");
}
}
输出为1432
。为什么不是1234
?锁定获取的顺序是什么"目标"?我认为它应该像这样工作:
等等。我的思维错误在哪里?
答案 0 :(得分:1)
这里要注意的是,synchronized
不保证执行顺序。它保证的是,在synchronized
完成之前,任何其他线程都不会修改被锁定的对象。
无法保证在多线程中将采用锁序列。
可能存在这样的情况,线程1在进入synchronized
块之前就已被击中/睡眠。