Как было предложено в нескольких ответах на этот вопрос:
Как называется эта техника блокировки?
Я реализовал ReentrantReadWriteLock и увидел большое ускорение (я знал, что в одном из моих классов было некоторое противостояние блокировок, и использование реентерабельной блокировки помогло ускорить работу).
Но теперь мне интересно: если внутри класса весь доступ (как чтение, так и запись) осуществляется путем предварительной блокировки либо read-lock, либо write-lock, означает ли это, что ключевое слово synchronized больше не должно использоваться в этом классе?
Например, вот один официальный пример Java 1.6, найденный на http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html
class RWDictionary {
private final Map m = new TreeMap();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try { return m.keySet().toArray(); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}
Здесь нет ключевого слова synchronize.
Теперь я понимаю, что одна из целей таких блокировок - быть быстрее других методов (в данном случае быстрее, чем synchronize), но какое техническое объяснение этому?
Заменяет ли использование блокировки чтения-записи в классе в каждом методе get/update ключевое слово synchronize для этих методов?