Как лучше всего использовать блокировки в Java (интервью)?

1

Меня спросили об этом в интервью: Псевдокод Ок

//Assume you have a list or A Queue
//1 - How do you make Sure pushing to list is safe?
//1 - My Ans: 
        void push(Element e){
            Synchronized(this){
               list.push(e);
              }
             }
//2- Interviewer said Ok, there is better way to do this without Synchronized word
          void push(Element e){
              writeLock.Lock();
              list.push(e);
              writeLock.UnLock();
             }
//3- He said Ok, but wouldn't work if there are 16 threads, How can I make sure only one thread can write?  His answer was more like a "Semaphore"
       void push(Element e){
             readLock.lock(16), //meaning get read lock on all 16 thrds
              writeLock.Lock(); //then allow to write
              list.push(e);
              writeLock.UnLock();
              readLock.Unlock()
             }

Я не уверен, что понял его решение в № 3, кто-то заботится объяснить и уточнить?

  • 2
    Если он говорит о ReadWriteLock , он не прав. «Блокировка чтения может удерживаться одновременно несколькими потоками считывателя, если нет записывающих устройств. Блокировка записи является исключительной».
  • 0
    Непонятно, что должно означать readLock.lock(16) . Вопрос не может быть обобщен. Ответ на 100% зависит от семантики конкретного класса. Вы должны будете отредактировать свой вопрос с более конкретным примером, иначе ответа нет.
Показать ещё 4 комментария
Теги:
multithreading
java.util.concurrent
locking

1 ответ

2

Идея читатели могут читать, только если нет записи. Другими словами, чтение является бесплатным. Таким образом, 16 потоков могут одновременно считываться. Однако, когда вы хотите писать, вы блокируете все (как процессы чтения, так и записи) и только записываете. Возможно, интервьюер взял эту идею из ConcurrentHashMap, поскольку значение по умолчанию для concurrencyLevel составляет 16.

Предлагаю вам ознакомиться с http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню