2011-01-31 3 views
-2

Я создаю систему запаса, которая будет использоваться через офисную сеть с несколькими пользователями. У меня есть запрос об использовании ключевого слова synchronized для правильного обновления запаса. То, что я хочу сделать, позволяет нескольким пользователям обновлять запас, но, конечно же, позволяет только одному пользователю обновляться за один раз. Для обновления запаса я разработал следующий метод:Правильный способ использования Java Synchronized?

public static synchronized boolean UpdateXYZStock(Stock so){ 
//update code 
} 

Это правильный способ сделать это?

Благодаря

С.

+0

Здесь вам необходимо предоставить более подробную информацию. – Woot4Moo

+0

java synchronized не охватывает виртуальные машины. Вы можете подумать о том, чтобы позволить вашей базе данных справляться с такими проблемами синхронизации. У UpdateStock() обновить значение запаса в БД. – DwB

ответ

4

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

private final Object writeLock = new Object(); 

public boolean UpdateXYZStock(Stock so) { 
    synchronized(writeLock) { 
     ... 
    } 
} 

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

+0

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

+0

Это правильно. Также обратите внимание, что вы должны использовать транзакции и гарантированную атомарность в базе данных, если сможете. –

+0

блестящий, спасибо большое Брайан! – Santiago

1

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

В противном случае необходимо выполнить то, что вы хотите.

+0

У меня есть другие статические методы в классе, поэтому я думаю, что предложение Брайана было бы более подходящим – Santiago

0

Вы также можете рассмотреть возможность использования ReadWriteLock.

0

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

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

+0

Код хранится в базе данных – Santiago

+0

, вы используете оптимистичный или пессимистический протокол блокировки для базы данных? –

+0

оптимистичная блокировка – Santiago