Java синхронизированные блоки с использованием конкретной ссылки на объект - PullRequest
0 голосов
/ 11 ноября 2018

Я использую код ниже, чтобы заблокировать одновременный доступ к объекту аукциона. Он получает объект из хэш-карты, поэтому он работает с широким спектром различных аукционов.

Я использовал синхронизированный блок со ссылкой на отдельный объект Аукциона, выбранный в качестве параметра. У меня сложилось впечатление, что это удерживает блокировку от монитора объектов и блокирует доступ к потокам также с использованием того же аукциона (пока не закончится первый случай).

Может ли кто-нибудь подтвердить, что этот код действует таким образом, что 1) Если два потока оба ссылаются на аукцион A, тогда только один может продолжаться одновременно 2) Если один поток ссылается на аукцион A и другой аукцион B, тогда они оба продолжают, как они приобретают разные замки.

    //Get auction from hashmap
    Auction biddingAuction = (Auction) auctions.get(ID);

    //Check that auction is active
    if(biddingAuction != null)
    {
        //Acquire lock on Auction object
        synchronized(biddingAuction) {

       //Some code that alters values of Auction

       }

    } else {
        return "\nBid failed - no auction with an ID of " + ID + " was found\n";
    }

любая ясность будет оценена, спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

Может ли кто-нибудь подтвердить, что этот код действует таким образом, что 1) Если два потока и ссылочный аукцион A, тогда только один может продолжаться в момент времени

Нет.Оба потока должны будут синхронизироваться на аукционе, чтобы иметь такую ​​гарантию.Если один поток не синхронизируется, он может получить доступ к аукциону, даже если другой поток удерживает свою блокировку.

Вот почему такой способ очень хрупок: если вы когда-нибудь забудете синхронизироваться перед доступом к изменяемой общей папке аукционасостояние (пишет ли он или читает), ваш код не является потокобезопасным.Гораздо более чистым способом было бы сделать сам класс Аукциона потокобезопасным, должным образом синхронизируя методы, которые обращаются к его общему изменяемому состоянию.

Если один поток ссылается на Аукцион A и другой Аукцион B, тогда они обапродолжайте, как они приобретают разные замки.

Да.Это правильно.

...