Lock. ReentrantLock. Synchronized. Fair lock vs nonfair lock

ReentrantLock может быть создан как с fair lock, так и с unfair lock. То же самое с Semaphore. Fair lock - это когда потоки получают доступ к ресурсу в том порядке, в котором они захотели захватить блокировку на ресурс. Unfair - это когда поток, который оказался в нужном месте в нужный момент, заберет блокировку себе, даже если он пришел позже чем остальные потоки. Пропуская способность unfair lock может быть значительно больше чем fair lock при опредленных обстоятельствах. По умолчанию ReentrantLock, а также блок synchronized используют nonfair лок.

В Java 5 ReentrantLock быстрее synchronized. В 6 по скорости одно и то же. Просто ReentrantLock предоставляет чуть больше возможностей, tryLock, lockInterruptibly, lock по таймауту и т.п

ReadWriteLock

Может быть удобен, когда есть много тредов, которые читают и всего несколько которые пишут. Ниже пример такого лока, хотя такой мэп всё равно проиграет ConcurentHashMap в производительности

private final ReentrantReadWriteLock readWriteLock =  new ReentrantReadWriteLock();
private final Lock read  = readWriteLock.readLock();
private final Lock write = readWriteLock.writeLock();


private Map<String, String> map = new HashMap<String, String>();
   
public void set(String key, String value) {
   write.lock();
   try {
      map.put(key, value);
    } finally {
       write.unlock();
     }
 }
    
public String get(String key) {
  read.lock();
  try{
     return dictionary.get(key);
   } finally {
       read.unlock();
    }
}


Комментариев нет:

Отправить комментарий