Я считаю, это простой вопрос, но все же я не получаю его самостоятельно. Скажем, у меня есть следующий код.порядок вызова синхронных методов
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()
идет перед нитью? Более того, если я поместил несколько вызовов методов объекта после блока синхронизации, все они будут вызваны впоследствии, и только тогда программа вернется к содержимому потока. Если я заменю эту линию вызова потока в синхронизирующем блоке, например, вызывая некоторый метод аналогового объекта, чем все в порядке и идет в указанном порядке.
Существуют ли у методов синхронизированного объекта какой-то приоритет в выполнении перед любыми потоками, синхронизированными на этом объекте?
Этот код не компилируется, к сожалению. – tkausl