Меня спросили об этом в интервью: Псевдокод Ок
//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, кто-то заботится объяснить и уточнить?
Идея читатели могут читать, только если нет записи. Другими словами, чтение является бесплатным. Таким образом, 16 потоков могут одновременно считываться. Однако, когда вы хотите писать, вы блокируете все (как процессы чтения, так и записи) и только записываете. Возможно, интервьюер взял эту идею из ConcurrentHashMap, поскольку значение по умолчанию для concurrencyLevel составляет 16.
Предлагаю вам ознакомиться с http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html
ReadWriteLock
, он не прав. «Блокировка чтения может удерживаться одновременно несколькими потоками считывателя, если нет записывающих устройств. Блокировка записи является исключительной».readLock.lock(16)
. Вопрос не может быть обобщен. Ответ на 100% зависит от семантики конкретного класса. Вы должны будете отредактировать свой вопрос с более конкретным примером, иначе ответа нет.