我相信,这是一个简单的问题,但我自己仍然没有得到它。比如说,我有以下代码。
Runnable objectRunnable = new Runnable() {
void run() {
synchronized(object) {
for (int i = 0; i < 5; i++) {
System.out.println("it's runnable");
Thread.sleep(100);
}
}
}
};
void doSomething() {
synchronized(object) {
for (int i = 0; i < 5; i++) {
System.out.println("it's doSomething");
Thread.sleep(100);
}
}
}
synchronized (object) {
new Thread(objectRunnable).start();
}
object.doSomething();
所以,输出就像
it's doSomething
it's doSomething
it's doSomething
it's doSomething
it's doSomething
it's runnable
it's runnable
it's runnable
it's runnable
it's runnable
问题是为什么 doSomething()
位于线程之前?此外,如果我在同步块(synchronized block)之后多次调用对象方法,它们都会随后被调用,然后程序才会返回线程的内容。如果我用调用某些模拟对象方法来替换同步块(synchronized block)中的线程调用行,那么一切都会正常,并且按指定的顺序进行。
同步对象本身的方法在执行该对象上同步的任何线程之前是否具有某种优先级?
最佳答案
因为主线程是第一个获得锁的。它可能是生成的线程,您只是无法确定,尽管这种可能性要小得多,因为调用 start() 后线程需要一些时间才能真正开始运行。
关于你的问题的其余部分,它太模糊了,无法回答。
关于java - 调用同步方法的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39052744/