В статье из документации Java8 https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html указано, что для синхронизации мы можем использовать 2 не связанных поля, потому что мониторы объектов этих полей будут разные (как я понял).
Также там дается наставление: "" Убедиться, что объекты действительно не связаны, получается что объект не может быть один и тот же.
В условиях задачи говорится в одном случае использовать значение хэшкода, а во втором номер элемента в массиве buckets, которое задается случайным образом! Получается 2 случайных числа. Но какие гарантии, что из массива locks будут выбраны именно 2 разных объекта при использовании 2 случайных чисел?
Dmitry
30 уровень
есть ли гарантия что из массива locks будут выбраны именно 2 разных объекта?
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
IceBergMaster
20 ноября 2019, 10:50
Почему объект не может быть один и тот же?
0
Dmitry Java Developer
21 ноября 2019, 02:37
Исходя из текста в официальной документации: "Synchronized statements are also useful for improving concurrency with fine-grained synchronization. Suppose, for example, class MsLunch has two instance fields, c1 and c2, that are never used together. All updates of these fields must be synchronized, but there's no reason to prevent an update of c1 from being interleaved with an update of c2 — and doing so reduces concurrency by creating unnecessary blocking. Instead of using synchronized methods or otherwise using the lock associated with this, we create two objects solely to provide locks."
0
Dmitry Java Developer
21 ноября 2019, 02:40
если update c1 не влияет на update c2, то можно применить данный метод синхронизации. Если мы будем использовать один и тот же объект, то update c1 будет влиять на update c2
0
IceBergMaster
21 ноября 2019, 08:30
Я что-то тебя совсем понять не могу, тебе поля лочить нужно, или сам объект?
Распиши пример конкретнее.
Поле c1 может влиять(или не влиять) на поле c2 согласно архитектуре и логике описанной в классе.
Если они не связаны, свободно используем отдельный локи для c1 и c2.
Если они связаны, использовав локи получаем дедлок или странное поведение.
"Если мы будем использовать один и тот же объект, то update c1 будет влиять на update c2" - как наличие/отсутствие влияния связано с использованием объекта?
Но я не пойму, как это связано с этой задачей, нам разве нужно отдельно лочить поля key и value? У нас же просто набор локов для объектов Node.
"есть ли гарантия что из массива locks будут выбраны именно 2 разных объекта?" - а чем это грозит? Ты опасаешься, что один объект будет дважды синхронизирован?)
0