• ,

task2707 - Определяем порядок захвата монитора

Реализуй логику метода isNormalLockOrder, который должен определять:
соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks — порядку передаваемых в него аргументов.
В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true.
Если наоборот — false.

Требования:
1. Метод isNormalLockOrder должен возвращать true в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o1, а потом по o2.
2. Метод isNormalLockOrder должен возвращать false в случае, если синхронизация в методе someMethodWithSynchronizedBlocks происходит сначала по объекту o2, а потом по o1.
3. Метод isNormalLockOrder НЕ должен быть приватным.
4. Класс Solution НЕ должен быть объявлен с модификатором final.

public class Solution {
    public void someMethodWithSynchronizedBlocks(Object obj1, Object obj2) {
        synchronized (obj2) {
            synchronized (obj1) {
                System.out.println(obj1 + " " + obj2);
            }
        }
    }

    public static boolean isNormalLockOrder(final Solution solution, final Object o1, final Object o2) throws Exception {

        Thread thread1 = new Thread(){
            @Override
            public void run() {
                solution.someMethodWithSynchronizedBlocks(o1,o2);
            }
        };
        synchronized (o1) {
            thread1.start();
            while (true) {
                Thread.State ts = thread1.getState();
                if (ts == Thread.State.BLOCKED) {
                    System.out.println(thread1.holdsLock(o2));
                    break;
                }
            }
        }
        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(isNormalLockOrder(solution, o1, o2));
    }
}


Почему thread1.holdsLock(o2) — при любом раскладе, выдает false ???
и как получить .holdsLock(o2) держателя мютекса у объекта о2 ???
  • ,

com.javarush.task.task27.task2712 Задание 8

Доброго времени суток, валидатор не принимает и выделяет неверный пункт: В методе createOrder класса Tablet должен быть создан новый AdvertisementManager и у него должен быть вызван метод processVideos.

Задание: Ресторан(8)

Пришло время описать функционал класса AdvertisementManager.

Но для начала нам понадобятся некоторые методы в классе Advertisement.

1. В классе Advertisement создай поле long amountPerOneDisplaying.

Оно должно равняться стоимости одного показа рекламного объявления в копейках (initialAmount/hits).

Присвой значение полю в конструкторе.

2. В классе Advertisement создай геттеры для полей name, duration и amountPerOneDisplaying.

3. Определим необходимые данные для объекта AdvertisementManager — это время выполнения заказа поваром.

Т.к. продолжительность видео у нас хранится в секундах, то и и время выполнения заказа тоже будем принимать в секундах.

В классе AdvertisementManager создай конструктор, который принимает один параметр — int timeSeconds.

Создай соответствующее поле и сохраните это значение в него.

4. AdvertisementManager выполняет только одно единственное действие — обрабатывает рекламное видео.

Поэтому создайте единственный публичный метод void processVideos(), его функционал опишем в следующем задании.

А пока выведем в консоль «calling processVideos method»

5. Чтобы тестировать данную функциональность, нужно добавить вызов processVideos метода у AdvertisementManager.

Очевидно, что этот метод должен вызываться во время создания заказа, а точнее — в параллельном режиме.

Заказ готовится в то время, как видео смотрится.

Добавьте вызов метода processVideos() в нужное место.

P.S. Не забудь что время приготовления заказа считается в минутах, а время показа рекламы в секундах!

public class Tablet extends Observable {
    final int number;
    private static Logger logger = Logger.getLogger(Tablet.class.getName());

    public int getNumber() {
        return number;
    }

    public Tablet(int number) {
        this.number = number;

    }
    public void createOrder(){
        try {
            Order order = new Order(this);
            if (!order.isEmpty()){
                ConsoleHelper.writeMessage(order.toString());
                setChanged();
                notifyObservers(order);      
        
                // якобы не выполненное действие или не верное решение
                new AdvertisementManager(order.getTotalCookingTime()*60).processVideos();
            }
        }catch (IOException e){
            logger.log(Level.SEVERE,"Console is unavailable.");
        }
    }

    @Override
    public String toString() {
        return "Tablet{" +
                "number=" + number +
                '}';
    }
}


Буду благодарен если поможете советом.

task2707 - Что не так с этой задачей?

Всем привет. Не могу пройти задачу task2707. Решил двумя способами и оба не проходят проверку, хотя вроде все верно. Может у кого, есть идеи по этому поводу.

Условие следующее:
Реализуй логику метода isNormalLockOrder, который должен определять: соответствует ли порядок synchronized блоков в методе someMethodWithSynchronizedBlocks — порядку передаваемых в него аргументов.

В случае, если сначала происходит синхронизация по o1, а потом по o2, метод должен вернуть true. Если наоборот — false.

1) Через запрос статуса нити.
synchronized (solution) {
            synchronized (o1) {
                Thread thread = new Thread() {
                    @Override
                    public void run() {
                        solution.someMethodWithSynchronizedBlocks(o1, o2);
                    }
                };
                thread.start();
                Thread.sleep(20);

                return thread.getState().equals(Thread.State.BLOCKED);
            }
        }


2) Через подсчет времени, которое необходимо для доступа к o1.
long startTime = System.currentTimeMillis();

        new Thread() {
            @Override
            public void run() {
                solution.someMethodWithSynchronizedBlocks(o1, o2);
            }
        }.start();

        Thread.sleep(50);

        synchronized (o1) {
            long endTime = System.currentTimeMillis() - startTime;
            return endTime > 100;
        }


Оба варианта выдают true, если сначала происходит синхронизация по o1 и false, если порядок изменен. Может быть я что-то упускаю из виду или неправильно понял условие задачи?

Если кто прошел на новом валидоторе — поделитесь пожалуйста опытом.