@iskateli

Synchronized, блокировка фрагмента кода или блокировка объекта?

Брюс Эккель, в "Философия Java" (полное издание) пишет (стр.923)
Когда задача желает выполнить фрагмент кода, охраняемый словом synchronized, она проверяет, захватывает её, выполняет код и снимает блокировку
, а потом чуть далее пишет, что
для управления доступом к совместному ресурсу вы для начала помещаете его внутрь объекта.
Так что использовать "фрагмент кода" или объект? Или любой совместно разделяемый ресурс ( в т.ч. и фрагмент кода) надо надо помещать внутрь объекта? Или можно сделать только метод совместно разделяемым ресурсом без засовывания его в объект? (так например сделано в примере кода на след. странице, но тогда я не понимаю зачем он написал помещать разделяемый ресурс внутрь объекта) Поясните пожалуйста.
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
зачем он написал помещать разделяемый ресурс внутрь объекта

Вообще-то, в джаве все объекты. Без них вы точно не обойдетесь

Или можно сделать только метод совместно разделяемым ресурсом без засовывания его в объект?


"Эти два способа записи означают одно и то же:"
public void swap() {

   synchronized (this)
   {
       //...логика метода
   }
}


public synchronized void swap() {

   }
}


synchronized всегда имеет отношение к какому-то объекту. Либо this, либо с явным указанием. Например:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...какая-то логика, доступная для всех потоков

       synchronized (obj) {

           //логика, которая одновременно доступна только для одного потока
       }
   }
}


по мотивам Оператор synchronized в Java
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы