Делает ли блокировка ReadWriteLock ключевое слово synchronized ненужным?

Как было предложено в нескольких ответах на этот вопрос:

Как называется эта техника блокировки?

Я реализовал 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 для этих методов?

7
задан Community 23 May 2017 в 10:24
поделиться