Условие:
Реализуй логику метода isLockOrderNormal, который должен определять:
соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks - порядку передаваемых в него аргументов.
В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true.
Если наоборот - false.
Требования:
• Метод isLockOrderNormal должен возвращать true в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o1, а потом по o2.
• Метод isLockOrderNormal должен возвращать false в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o2, а потом по o1.
• Метод isLockOrderNormal НЕ должен быть приватным.
• Класс Solution НЕ должен быть объявлен с модификатором final.
package com.javarush.task.task27.task2707;
/*
Определяем порядок захвата монитора
*/
public class Solution {
public void someMethodWithSynchronizedBlocks(Object obj1, Object obj2) {
synchronized (obj1) {
synchronized (obj2) {
System.out.println(obj1 + " " + obj2);
}
}
}
public static boolean isLockOrderNormal(final Solution solution, final Object o1, final Object o2) throws Exception {
//do something here
return false;
}
public static void main(String[] args) throws Exception {
final Solution solution = new Solution();
final Object o1 = new Object();
final Object o2 = new Object();
System.out.println(isLockOrderNormal(solution, o1, o2));
}
}
Решение:
Для реализации метода isLockOrderNormal, который будет определять порядок захвата мониторов в методе someMethodWithSynchronizedBlocks, нам нужно выполнить следующие шаги: 1. Создать экземпляр класса Solution: Мы уже имеем экземпляр класса Solution, который будет использоваться для вызова метода someMethodWithSynchronizedBlocks. 2. Создать два объекта для синхронизации: В методе main у нас уже есть два объекта o1 и o2, которые мы будем передавать в метод isLockOrderNormal. 3. Использовать потоки для проверки порядка синхронизации: Мы создадим два потока, которые будут вызывать метод someMeth...
В этом коде мы создали два потока, которые пытаются захватить мониторы в разном порядке. Мы используем , чтобы контролировать, когда каждый поток начинает выполнение. После выполнения потоков мы проверяем, какой поток завершился первым, чтобы определить порядок захвата мониторов. Если первый поток завершился до второго, это означает, что порядок захвата был нормальным (сначала , затем ), и мы возвращаем . В противном случае возвращаем .