Просто наугад расставил... 😏
Может кто-нибудь объяснить последовательность блокировок???
Жора Нет
39 уровень
Если честно, ниче не понятно😞
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Майкл Мэдсен
6 августа 2022, 13:40
любой метод с synchronized блокирует текущий объект.
Создаются два потока, в них два объекта(одного и того же класса). Каждый из них вызывает первый метод sout.
Так как этот метод synchronized, то уже мютекс включается на всем объекте этого класса. То есть происходит блокировка. Метод sout в конце, вызывает второй synchronzied метод sout2. Однако он блокируется тоже на объекте данного класса, который уже заблокирован у нас благодаря первому методу - sout.
Два потока успели выполнить только первый метод и ждут, пока сами же освободят мютекс. Они стоят перед вратами во второй метод sout2 ( никогда не зайдут туда).
+1
Жора Нет
7 марта 2022, 09:51
public class Solution {
private final String field;
public Solution(String field) {
this.field = field;
}
public String getField() {
return field;
}
public synchronized void sout(Solution solution) {
System.out.format("111: %s: %s %n", this.field, solution.getField());
solution.sout2(this);
}
public synchronized void sout2(Solution solution) {
System.out.format("222: %s: %s %n", this.field, solution.getField());
solution.sout(this);
}
public static void main(String[] args) {
final Solution solution = new Solution("first");
final Solution solution2 = new Solution("second");
new Thread(new Runnable() {
public void run() {
solution.sout(solution2);
}
}).start();
new Thread(new Runnable() {
public void run() {
solution2.sout(solution);
}
}).start();
}
}
0