Смешайте летучие и синхронизированные как замок для чтения

StackOverflow https://stackoverflow.com/questions/4289837

Вопрос

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

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

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

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

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--;
}
Это было полезно?

Решение

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

Я так думаю.

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

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top