Стоимость синхронизации - PullRequest
10 голосов
/ 04 декабря 2010

В высокопараллельной Java-программе и при условии, что мои методы написаны правильно и правильно синхронизированы, я задаюсь вопросом, как определить, что лучше:

void synchronized something() {
     ...
}

или

void something() {
     synchronized(this) {
         ...
     }
     // here do stuff no requiring synchronization
     .
     . // do computation 'A'
     .
     synchronized(this) {
         ...
     }
     // here do other stuff no requiring synchronization
     .
     . // do computation 'B'
     .
     synchronized(this) {
         ...
     }
}

Теперь я понимаю, что если вычисления 'A' и 'B' занимают много времени, вторая версия, очевидно, лучше.

Мой вопрос, однако, таков: в какой момент вы знаете, что вторая версияболее эффективен?

Всегда ли вторая версия быстрее или есть скрытые затраты на получение / снятие блокировки несколько раз?

Что если мои вычисления 'A' просто тривиальны, как:

s.getString().substring( 0, 2 ).toLowerCase();

Ответы [ 3 ]

8 голосов
/ 04 декабря 2010

Да, synchronized стоит времени.Если фактические вычисления просты и находятся внутри цикла или около того, это стоит лотов времени по сравнению с фактическими вычислениями.

См. Этот пример: http://ideone.com/zgpB7

  • Синхронизация внутренней части: приблизительно 0,025 с
  • Синхронизация всего цикла: менее 0,001 с

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

2 голосов
/ 04 декабря 2010

thejh отмечает, что есть некоторая плата за повторную блокировку потока.Тем не менее, всякий раз, когда я говорил с людьми о параллельных потоках, это всегда было связано с тем, чтобы все потоки выполнялись быстро при одновременной работе.другие темы.Они должны сидеть и ждать, пока вы выполняете работу, которая не будет мешать работе, которую они хотят делать.Если в такой ситуации миллисекунды действительно важны для вас, вы должны использовать профилировщик, чтобы увидеть, что работает лучше всего в вашей ситуации.Оптимизация многопоточности - это одна из тех ситуаций, когда существуют «лучшие практики», которые в целом справедливы, но вы не получите правило, работающее во всех ситуациях.Если вам нужна такая большая степень детализации, вы должны проверить ее и посмотреть.

1 голос
/ 04 декабря 2010

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

...