Смешайте энергозависимые и синхронизированные как блокировка чтения-записи - PullRequest
7 голосов
/ 27 ноября 2010

Рассмотрим переменную примитивного типа с большим количеством потоков чтения и записи нескольких потоков, будет ли следующий код работать правильно?

Если да, обеспечивает ли он лучшую производительность, чем 1). объявление синхронизировано по всем методам; 2). используя явный ReadWriteLock?

Это обычная модель? Если нет, какой шаблон обычно используется в этой ситуации?

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

private volatile int value = 1;

public void func1()
{
    if (value == 1) {
        // do something
    }
}

public void func2()
{
    if (value == 2) {
        // do something
    }
}

public void func3()
{
    if (value == 3) {
        // do something
    }
}

public synchronized void increase()
{
    if (value < 10) value++;
}

public synchronized void decrease()
{
    if (value > 0) value--;
}

Ответы [ 3 ]

5 голосов
/ 16 июня 2012

Да, это обычно, по крайней мере, в определенной степени:)

Шаблон, который вы используете, описан в этой статье IBM -> http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

(шаблон № 5, дешевый трюк блокировки чтения-записи)

3 голосов
/ 27 ноября 2010

Рассмотрим переменную примитивного типа с большим количеством потоков чтения и записи нескольких потоков, будет ли следующий код работать правильно?

Я так думаю.

Если да, обеспечивает ли он лучшую производительность, чем 1).объявление синхронизировано по всем методам;2).использование явного ReadWriteLock?

Я так думаю, при условии, что операции чтения превосходят число запросов записи.Тем не менее:

  • Если этот счетчик не является слишком спорным, это, вероятно, не имеет значения.Не тратьте свое время на микрооптимизацию чего-либо, если у вас нет доказательств того, что это (или будет) узким местом.
  • Если это действительно важно для вас, сравните это.
  • Не удивляйтесь, если относительная производительность зависит от версий / уровней исправлений JVM, параметров JVM и аппаратного обеспечения;например, число процессоров и архитектура памяти.

Это общий шаблон?Если нет, какой шаблон обычно используется в этой ситуации?

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

0 голосов
/ 27 ноября 2010

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

...