Я понимаю, что значит синхронизация по методу, но не пойму что такое синхронизация по объекту

124
28 ноября 2020, 06:10

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

public synchronized void inty(){
   i++;
}

В данном случае потоки выстраиваются в очередь перед методом, так как он промаркирован ключевым словом synchronized. То есть в данном случае, слово synchronized обозначает некую защелку, которую закрывает и открывает каждый входящий поток. Но как понять запись типа

public void inty(){
   synchronized (object){
     i++;
   }
}

Я не могу понять логику и не могу даже объяснить, как в данном случае работает код. Объясните на пальцах без применения высокоразвитых терминов. Спасибо

Answer 1

"Синхронизация по объекту" означает, что к объекту, являющемуся разделяемым ресурсом (второй случай), будет иметь доступ только один поток одновременно.

У каждого объекта в Java существует атрибут, обеспечивающий контроль за доступом к данному объекту. Он называется монитор (он же мьютекс). Работает он так: если поток1 использует ресурс (объект) и захватил его монитор (с помощью synchronized), то поток2, желающий использовать тот же ресурс (объект), должен подождать освобождения монитора, захватить его и только потом начать использовать ресурс.

https://github.com/enhorse/java-interview/blob/master/concurrency.md

READ ALSO
Множественный catch

Множественный catch

Почему не отрабатывает программа? То есть почему только Arith в консоли я вижу? Потому что "выбран" method1? Чтобы такой код отработал каждый метод...

148
SQLite ошибка при добавление

SQLite ошибка при добавление

Нашел пример в интернете как работать с бд решил реализовать под свою задачуСоздал класс DBHelper:

150
Sugar ORM Android

Sugar ORM Android

Решил изучить эту ORM потому что на примерах она показалось мне легкимТак вот есть простой объект:

141
Как я могу запускать DialogFragment после загрузки Activity?

Как я могу запускать DialogFragment после загрузки Activity?

Есть DialogFragment который должен запускаться при открытии Activity, но возникла проблема, видно тормоза, думаю из-за того что DialogFragment грузиться вместе...

145