Безопасный способ зафиксировать состояние приложения? - PullRequest
1 голос
/ 08 августа 2010

Если у меня есть приложение, подобное этому:

Class Application {  
    List state1 = new ArrayList();  
    Map state2  = new HashMap();  
}  

И у меня запущена служба RPC в другом потоке, который использует для сообщения о состоянии приложения (например, сколько элементов в состоянии1, какоесодержатся в ключах state2).Какой лучший способ сделать это?Я нахожу способ избежать использования синхронизации при доступе к полям state1 и state2 (что может снизить производительность приложения).

1 Ответ

1 голос
/ 08 августа 2010

Существует два аспекта стоимости синхронизации.

  1. Служебные расходы самой synchronized

  2. Стоимость операций, выполняемых в этом блоке.

В качестве примера:

public synchronized int[] getState() {
 return new int[] { state1.size(), state2.size() };
}

this используется для блокировки.Операции в этом случае являются чрезвычайно дешевыми (т.е. получение size() из Colleciton или Map).Таким образом, единственное беспокойство - это стоимость synchronized.

В современных JVM стоимость настолько низкая, что о ней даже не стоит беспокоиться, кроме как в самых экстремальных ситуациях.Под «наиболее экстремальным» я подразумеваю, когда количество таких вызовов невероятно велико или требуемая задержка невероятно мала (менее микросекунды).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...