Есть ли преимущество в использовании синхронизированного метода вместо синхронизированного блока?

% - это оператор форматирования строки (также известный как оператор интерполяции ), см. http://docs.python.org/library/stdtypes .html # строка форматирование

395
задан Mahozad 8 July 2018 в 12:24
поделиться

9 ответов

кто-либо может сказать мне преимущество синхронизированного метода по синхронизируемому блоку с примером? Спасибо.

нет ясного преимущества использования синхронизированного метода по блоку.

, Возможно, единственный (но я не назвал бы это преимуществом) является Вами, не должны включать Метод ссылки на объект this.

:

public synchronized void method() { // blocks "this" from here.... 
    ...
    ...
    ...
} // to here

Блок:

public void method() { 
    synchronized( this ) { // blocks "this" from here .... 
        ....
        ....
        ....
    }  // to here...
}

Посмотрите? Никакое преимущество вообще.

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

Сравните:

// locks the whole object
... 
private synchronized void someInputRelatedWork() {
    ... 
}
private synchronized void someOutputRelatedWork() {
    ... 
}

по сравнению с [1 116]

// Using specific locks
Object inputLock = new Object();
Object outputLock = new Object();

private void someInputRelatedWork() {
    synchronized(inputLock) { 
        ... 
    } 
}
private void someOutputRelatedWork() {
    synchronized(outputLock) { 
        ... 
    }
}

Также, если метод растет, можно все еще сохранить синхронизируемый раздел разделенным:

 private void method() {
     ... code here
     ... code here
     ... code here
    synchronized( lock ) { 
        ... very few lines of code here
    }
     ... code here
     ... code here
     ... code here
     ... code here
}
425
ответ дан Pramod 8 July 2018 в 22:24
поделиться
  • 1
    Привет Romain, I' m в аналогичной ситуации (кроме I' m вид связанных к RelativeLayout некоторым кодом i can' t редактирование). RelativeLayout установлен на wrap_content, и расположение для моей кнопки установлено на alignParentBottom, но поскольку OP говорит, кнопка появляется наверху relativelayout. Есть ли что-то, что пытается гарантировать, что все элементы relativelayout всегда видимы? – Sam 8 August 2012 в 12:02

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

7
ответ дан Paul Tomblin 8 July 2018 в 22:24
поделиться

Примечание: статичный синхронизированные методы и блоки работают над Объектом класса.

public class MyClass {
   // locks MyClass.class
   public static synchronized void foo() {
// do something
   }

   // similar
   public static void foo() {
      synchronized(MyClass.class) {
// do something
      }
   }
}
29
ответ дан Peter Lawrey 8 July 2018 в 22:24
поделиться
  • 1
    there' s положительная сторона. так как мой пример говорит @optional это doesn' t действительно имеют значение, соответствует ли объект. I' m действительно заинтересованный, в если it' s не дополнительный. I' ll вынимают это из примера. Если я понимаю это правильно, isn' t performSelector просто избегающий соответствия протокола проверяют здесь. Wouldn' t это все еще быть возможными присвоить не соответствующему делегату, так как средства доступа делегата на самом деле определяются в суперклассе UITextViews? – fess . 18 May 2010 в 18:42

Синхронизированный метод

Профессионалы:

  • Ваш IDE может указать на синхронизированные методы.
  • синтаксис более компактен.
  • Силы для разделения синхронизируемых блоков к отдельным методам.

Недостатки:

  • Синхронизируется с этим и так позволяет посторонним синхронизироваться с ним также.
  • более трудно переместить код вне синхронизируемого блока.

Синхронизировал блок

Профессионалы:

  • Позволяет использовать частную переменную для блокировки и так вынуждать блокировку остаться в классе.
  • Синхронизируемые блоки могут быть найдены путем поиска ссылок на переменную.

Недостатки:

  • синтаксис более сложен и так делает код тяжелее для чтения.
<час>

Лично я предпочитаю использовать синхронизированные методы с классами, сфокусированными только к вещи синхронизация необходимости. Такой класс должен быть как можно меньше и таким образом, должно быть легко рассмотреть синхронизацию. Другие не должны должны быть заботиться о синхронизации.

76
ответ дан richq 8 July 2018 в 22:24
поделиться
  • 1
    Работавший для меня. Цикл через все столбцы в сетке и выполняет код выше во всех них. поместите цикл в обработчик для grid' s событие Loaded – saus 18 February 2011 в 00:12

Чаще всего я использую это для синхронизации доступа к списку или карте, но я не хочу блокировать доступ ко всем методам объекта.

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

private List<Foo> myList = new ArrayList<Foo>();
private Map<String,Bar) myMap = new HashMap<String,Bar>();

public void put( String s, Bar b ) {
  synchronized( myMap ) {
    myMap.put( s,b );
    // then some thing that may take a while like a database access or RPC or notifying listeners
  }
}

public void hasKey( String s, ) {
  synchronized( myMap ) {
    myMap.hasKey( s );
  }
}

public void add( Foo f ) {
  synchronized( myList ) {
    myList.add( f );
// then some thing that may take a while like a database access or RPC or notifying listeners
  }
}

public Thing getMedianFoo() {
  Foo med = null;
  synchronized( myList ) {
    Collections.sort(myList);
    med = myList.get(myList.size()/2); 
  }
  return med;
}
12
ответ дан Clint 8 July 2018 в 22:24
поделиться
  • 1
    Учитывая, что it' s дополнительный, wouldn' t этот катастрофический отказ, если делегат doesn' t реализуют метод? – Chuck 18 May 2010 в 18:07

Единственная реальная разница - то, что синхронизируемый блок может выбрать, на каком объекте он синхронизируется. Синхронизированный метод может только использовать 'this' (или соответствующий Экземпляр класса для синхронизируемого метода класса). Например, они семантически эквивалентны:

synchronized void foo() {
  ...
}

void foo() {
    synchronized (this) {
      ...
    }
}

последний более гибок, так как это может конкурировать за связанную блокировку любой объект, часто членская переменная. Это также более детализировано, потому что у Вас мог быть параллельный код, выполняющийся прежде и после блока, но все еще в рамках метода. Конечно, Вы могли столь же легко использовать синхронизированный метод путем рефакторинга параллельного кода в отдельные несинхронизированные методы. Используйте, какой бы ни делает код более понятным.

138
ответ дан jcrossley3 8 July 2018 в 22:24
поделиться

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

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

Object writeLock = new Object();

И с этого времени каждый раз, производители хотят добавить новое сообщение, мы просто соединяем это:

synchronized(writeLock){
  // do something
}

, Таким образом, потребители могут все еще читать, и производители будут заблокированы.

36
ответ дан cdecker 8 July 2018 в 22:24
поделиться

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

3
ответ дан Alex Miller 8 July 2018 в 22:24
поделиться
  • 1
    Это не точно корректно. В то время как третьи лица могут создать Аудиоустройства для MAC OSX, iOS не позволяет разработчикам делать так. Вместо этого на iOS необходимо будет полагаться на запись (или использование кого-то else' s) представьте функцию обратного вызова, которую назовут, когда устройству вывода (или безотносительно аудиоустройства, с которым Вы хотите соединиться) будет нужно больше аудиоданных. Эта страница показывает доступные Аудиоустройства на iOS. – Tom 14 February 2013 в 09:48

Синхронизированный метод используется для блокировки всех объектов. Синхронизированный блок используется для блокировки определенного объекта

4
ответ дан 22 November 2019 в 23:42
поделиться