Как выполнить метод безопасности потока на стороне сервера в Java? - PullRequest
0 голосов
/ 25 июня 2011

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

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

  if (availableRooms()>0) {

      synchronized(syncObject_) {

        if (availableRooms()>0) {
           makeReservation()
        }

      }

    }
    return instance_;
  }

Это приемлемое решение? Это работает?

Ответы [ 3 ]

3 голосов
/ 25 июня 2011

Это будет работать, только если у вас есть только один сервер. Если вам когда-либо понадобится увеличить масштаб, запросы могут поступать на разные серверы, и синхронизированные не будут работать. В этом случае вы, вероятно, все равно будете использовать базу данных, и вам следует использовать транзакции БД.

0 голосов
/ 25 июня 2011

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

synchronized(this){
    //...
    makeReservation()
    //...
}

Однако, пока существует только один экземпляр _syncObject доступно для всех потоков, и в вашем коде нет другого места, которое может вызвать makeReservation(), ваш метод также будет работать.

Обратите внимание: если вы используете базу данных, вы можете просто установитьУровень изоляции базы данных до SERIALIZABLE, выполните транзакцию базы данных для makeReservation(), и база данных позаботится обо всем этом за вас.

0 голосов
/ 25 июня 2011

Ваш код выглядит как идиома двойной проверки .

Но ваша идея в порядке, если только вы синхронизируете только один синглтон. (В вашем примере это syncObject_.) У вас может быть больше, то есть, когда у вас есть больше серверов, работающих для балансировки нагрузки. Зарезервируйте синглтон и сделайте проверку свободных номеров и самого бронирования в одной синхронизированной области.

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