Как работает синхронизация на объекте с использованием objectId или хэш-кода? - PullRequest
0 голосов
/ 01 мая 2019

Может кто-нибудь объяснить, как синхронизация получает блокировку для объекта?

У меня есть код, в котором я хочу динамически получить блокировку для значения String.

например,

String a = "abc";
synchronization(a){
   //some logic
}

Теперь то, что я хочу, это если из API я получаю значение abc из одного запроса, а по другому запросу я получаю значение as как abc, получая блокировку предыдущего запроса, новый запрос должен ждать на основе значение.

Может кто-нибудь помочь, как это работает / как мне этого добиться?

1 Ответ

3 голосов
/ 01 мая 2019

Теперь то, что я хочу, это если из API я получаю значение abc из одного запроса, а по другому запросу я получаю значение as как abc, получая блокировку предыдущего запроса, новый запрос должен ждать на основе значение.

Чтобы использовать synchronized для этого, вам нужно убедиться, что "abc" объекты были одинаковыми строковыми объектами , а не просто эквивалентными строками (по той же причине вы не t сравнить строки с ==), используя intern.

synchronized (a.intern()) {
    // ...
}

synchronized требует один и тот же объект, а не только эквивалентные.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...