2009-10-08 3 views
1

Для бронирования веб-приложения для путешествий, в котором зарегистрировано 100 одновременных пользователей, следует забронировать билет и создать «номер E-Ticket Number» с помощью «синхронизированного» или «статического синхронизированного» метода?В чем разница между синхронизированной и статической синхронизацией?

ответ

20

Хорошо, вы знаете разницу между статическим методом и методом экземпляра в целом?

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

Другими словами, это:

class Test 
{ 
    static synchronized void Foo() { ... } 

    synchronized void Bar() { ... } 
} 

является примерно эквивалентно:

class Test 
{ 
    static void Foo() 
    { 
     synchronized(Test.class) 
     { 
      ... 
     } 
    } 

    void Bar() 
    { 
     synchronized(this) 
     { 
      ... 
     } 
    } 
} 

Вообще я стараюсь не использовать синхронизированные методы на всех - я предпочитаю явно синхронизировать частный блокировка:

private final Object lock = new Object(); 

... 

void Bar() 
{ 
    synchronized(lock) 
    { 
     ... 
    } 
} 

У вас нет предоставили достаточно информации, чтобы определить, должен ли ваш метод быть статическим или экземпляром, или вообще ли он должен быть синхронизирован. Многопоточность - сложная проблема - я настоятельно рекомендую вам прочитать ее (через книги, учебные пособия и т. Д.).

+0

Если на веб-сайте бронирования путешествий существует 100 одновременных пользователей. Затем функция «Бронирование билетов» и функция «E-Tickect Number» должны быть реализованы в «синхронизированном» блоке или «статическом синхронизированном» блоке? – 2009-10-08 07:22:09

+2

И ваш вопрос, и этот комментарий, который повторяется, не имеет смысла. если превосходный ответ Джона Скита не соответствует вашим потребностям, пожалуйста, перефразируйте свой вопрос. – SingleShot

+1

Из любопытства: как это «грубо» эквивалентно? У меня создалось впечатление, что эффективное выполнение одного и того же (даже если «синхронизировано» на методе превращено в флаг вместо некоторых инструкций байткода (к которым синхронизирован блок). –

3

Ответ Джона охватывает разницу, намеченную в заголовке вопроса.

Тем не менее, я бы сказал, что для создания номера билета необходимо использовать ни. Исходя из предположения, что они хранятся в базе данных, где-то - база данных должна отвечать за генерирование номера при вставке новой записи (предположительно с помощью автоинкрементного первичного ключа или чего-то подобного).

В противном случае, если вы должны сгенерировать номер в Java-коде, я подозреваю, что накладные расходы синхронизации могут быть весьма заметны у 100 одновременных пользователей. Если вы работаете на Java 1.5 или более поздней версии, я хотел бы использовать java.util.concurrent.AtomicInteger, чтобы получить номер билета, который вы можете просто позвонить в

private static final AtomicInteger ticketSequence; 

static 
{ 
    final int greatestTicket = getHighestExistingTicketNumber(); // May not be needed if you can start from zero each time 
    ticketSequence = new AtomicInteger(greatestTicket + 1); 
} 

public /*static*/ int getNextTicketNumber() 
{ 
    return ticketSequence.incrementAndGet(); 
} 

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

Смежные вопросы