замки синхронизации Java и блокировки -synchronized

A, синхронизируются ключевое слово

1, синхронизируются профиль

синхронизированы основой для достижения синхронизации: Java каждый объект может быть использован в качестве замка. Когда замок должен быть освобожден, когда поток пытается получить доступ к коду синхронизации, вы должны сначала получить объект блокировки, выход или исключение.

Формы: синхронизации блока и способ синхронизации .


2, синхронизированные сценарии использования

  • Способ синхронизации

public synchronized void method1(){}复制代码

Объект заблокирован экземпляр , когда экземпляр объекта в методе синхронизации вызовов из разных потоков, поток только получить блокировку, а остальное блокируется. Но если разные нити к этому классу различных экземпляров объекта , чтобы выполнить этот метод синхронизации , то не будет заблокирован , потому что они используют различные замки.


  • Код синхронизации блока

synchronized(this)( //ToDo}
或
synchronized(普通变量){    }复制代码

то же самое


  • Статический метод синхронного

public synchronized static void method3(){}复制代码

Этот класс блокируется, когда другой поток вызывает класс статический синхронизированный метод , когда у вас есть только один поток , чтобы приобрести замок , оставшийся поток блокируется .


  • Статический блок кода

synchronized(Test.class){ //ToDo}
或
synchronized(静态变量){ //ToDo}复制代码

то же самое


3, синхронизированное укрупнение блокировок

Есть четыре вида блокировки уровня состояния от низкого до высокого являются: блокировка в свободном состоянии , предвзято замок состояние , легкий замок и тяжеловес замок

Блокировка может обновить, но не может понизить, обновить ангажированные средства блокировки не могут быть понижены до уровня предвзятых блокировок легкого замка.

  • Предвзятость замок

Большой случай, нет многопоточного замка не только конкурировать, но всегда получает много раз по той же нити, нитям для того, чтобы обеспечить снижение затрат, вносимых необъективным замком.

Когда один поток для доступа и синхронизации кода, чтобы получить блокировку, блокировка будет записи головки и объекта в кадре стека для нити ID хранящегося предвзятым замок, после выхода резьбы и повторно входит в замок синхронизации, блокировка не требуется для работы и КАН разблокировать, а просто проверить, является ли глава Марка Слова объектов хранятся в текущем потоке выполнения необъективной блокировки.

Предвзятость замок эффект: когда нет других потоков конкуренции, была предвзятость текущий поток, текущий поток может быть выполнен.


  • Легкий замок (спиновые замки)

Легкий замок, замок смещен по переходу с.

Необъективная операция блокировки в случае потока входит в синхронизированный блок, при добавлении к второй нити блокировки конкуренции, когда замок будет обновлен до легкого необъективного замка.

  • Heavyweight замок

После расширения легкого замка, замок будет обновлен до тяжеловеса.

Полагается на внутреннем объекте замка, когда замок вес монитора для достижения, а также контролировать и операционную систему зависит MutexLock (мьютекс) для достижения, он также известен супертяжелый семафор блокировки (синхронизированный является супертяжелом блокировки).


Предвзятость замок

не Преимущества: никакая дополнительная Блокировка и разблокировка потребления

Недостатки: есть конкуренция нить, это принесет дополнительное потребление блокировка отозванных

Сцена: одна синхронизации потоков блокировать доступ к сценам

Легкий замок

Плюсы: Нить не блокирует конкуренцию, повысить скорость отклика программы.

Недостатки: не освобождает CPU, когда спин нить

Сцена: время поиска ответа, синхронизации блоков выполняется очень быстро.

Heavyweight замок

Преимущества: конкуренция не использует спиновую нить, освобождая центральный процессор

Недостатки: поток блокируется, время отклика медленно.

Сцена: преследование определенных блоков синхронизации скорости выполнения долго.


Во-вторых, интерфейс блокировки

1, интерфейс блокировки

Lock, блокировка объектов. Перед замком появится интерфейс, синхронизированной ключевыми словами программы Java для достижения функции блокировки. И в новом контракте и интерфейс блокировки после Java SE5.0 для достижения функции блокировки.

Она обеспечивает синхронизированный ключевое слово аналогичную функцию синхронизации, но нужно показать, чтобы получить и освободить замки, как разница между двумя дополняют текст.


Блокировка основных методов интерфейса:

  • аннулируются замок ()

При осуществлении способа, когда замок находится в неактивном состоянии, текущий поток будет получить блокировку. Наоборот, если замок был проведен другой поток, текущий поток, чтобы приобрести замок запрещено.


  • булево tryLock ()

Если блокировка доступна, получить блокировку и немедленно возвращает истину, иначе ложь.

Разница tryLock () и блокировки () являются:

tryLock () просто пытается получить блокировку, если блокировка не доступна , не вызывает текущий поток отключен , текущий поток продолжает выполнять код вниз.

Блокировка () обязательно получить блокировку, если блокировка не доступна , она ждет , пока блокировка не получается, текущий поток не продолжается вниз самостоятельно.


  • недействительная разблокировка ()

При выполнении метода, текущий поток выполняется блокировка снимается, замок может быть освобожден только держателем, если ни один поток не удерживает блокировку, выполнение метода может привести к неожиданным образом.


  • Состояние newCondition ()

объект Состояние, ожидая, чтобы получить компонент уведомления. Сборка и текущие привязки замокли, только текущий поток, чтобы получить блокировку, будут вызывать в ожидание метода компонента (), после вызова, текущий поток снимает блокировку.


2, использование ReentrantLock

ReentrantLock очень проста в использовании, просто чтобы показать вызов, чтобы получить блокировку синхронизации, для снятия блокировки синхронизации.

ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁
.....................

try {
    lock.lock(); //如果被其它资源锁定,会在此等待锁释放,达到暂停的效果
    //操作
}catch(Exception e){
   //异常处理
} finally {
    lock.unlock();  //释放锁
}复制代码

замок ReentrantLock, используется в условиях высокой производительности параллельной гораздо выше, чем синхронизированное ключевое слово.

И reentratnlock справедливое и несправедливая блокировка очередь основаны на внутренне благоустроенных запертой дважды связанный список , узел значения таблицы Node каждого запрос текущей блокировку потока.


3, ReadWriteLock интерфейс

ReadWriteLock основного интерфейса следующим образом:

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading
     */
    Lock readLock();

    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing
     */
    Lock writeLock();
}复制代码

ReadWriteLock управления набором замков, является блокировка чтения только блокировка записи.

Java библиотека параллелизма ReentrantReadWriteLock реализует интерфейс и добавлен ReadWriteLock функции реентрантной.


Читайте замки в то же время позволяет несколько потоков для доступа, но процесс записи , чтобы получить доступ ко всей теме читателя и другие процессы записи будут заблокированы .

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


Некоторые функции ReentrantReadWriteLock чтения-записи блокировки :

  • Селективный ярмарка
  • входящий угол
  • Блокировка понижения


Примеры блокировок чтения-записи (программы из blog.csdn.net/canot/artic…Интернета: ):

public class Cache{
  static Map<String,Object> map = new HashMap<String,Object>();
  static ReentrantReadWriteLock  rwl = new ReentrantReadWriteLock();
  static Lock rLock = rwl.readLock();
  static Lock wLock = rwl.writeLock();

  //获取一个key对应的value
  public static final Object get(String key){
     r.lock();
     try{
         return map.get(key);
     }finally{
         r.unlock();
     }
  }

  //设置key对应的value并返回旧的value
  public static fianl Object put(String key,Object value){
     w.lock();
     try{
        return map.put(key,value);
     }final{
        w.unlock();
     }
  }

  //清空缓存
  public static fianl void clear(){
     w.lock();
     try{
        map.clear();
     } finally{
        w.unlock();
     }
  }
}复制代码


  • Чтение-запись блокировки даунгрейд блокировки

Блокировка понижения Понижение рейтинга означает блокировку записи , чтобы быть прочитан замки. Процесс , если текущий поток удерживает блокировку записи, а затем отпустить его снова , чтобы получить блокировку чтения нельзя назвать замок понижение в должности. Блокировка понижение означает , что во время проведения повторного приобретения блокировки чтения и записи блокировки, получить в процесс письма после выхода замка до замка чтения под названием разблокировка.

(Производный от blog.csdn.net/qq_38737992…программы: )

public void work() {
        reentrantReadWriteLock.readLock().lock();
 
        if (!update) {
            reentrantReadWriteLock.readLock().unlock();
 
            // 锁降级开始
            reentrantReadWriteLock.writeLock().lock();
            try {
                if (!update) {
                    // 准备数据
                    ++index;
                    try {
                        TimeUnit.MILLISECONDS.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    update = true;
                }
                reentrantReadWriteLock.readLock().lock();
            } finally {
                reentrantReadWriteLock.writeLock().unlock();
                // 锁降级结束,降级为读锁
            }
        }
        try {
            // 使用数据
            for (int i=0; i<5; i++) {
                try {
                    TimeUnit.MILLISECONDS.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ":" + index);
            }
        } finally {
            reentrantReadWriteLock.readLock().unlock();
        }
    }
复制代码


Три, синхронизируются и разница блокировки

1, синхронизированы и разница блокировки

синхронизируются ключевое слово, которое является блокировка интерфейса

синхронизируется состояние не может определить, является ли или не приобретать замок, блокировка может определить, следует ли получить блокировку

синхронизируется автоматически освободить блокировки (код синхронизации после выполнения нити будет автоматически освободить замок, исключение снятия блокировки происходит во время исполнения нити; б)

необходимость вручную заблокировать, наконец, снять блокировку (разблокировать () метод освобождает блокировку), или может привести к нити тупика.

Два синхронизируются ключевой слово нити 1 и нить 2, 1, если текущий поток приобрести замок, нить 2 ждать, если блокированный поток 1, поток 2 будет ждать вечно.

Замок блокировки не обязательно будет ждать дольше, получают меньше, чем если вы пытаетесь заблокировать, поток не может быть ожидания закончилось.


синхронизированный замок реентерабельные, не может быть прервана, несправедливо .

блокировки замка реентерабельного, прерываемый, быть справедливым

замок замок для многих синхронизации коды синхронизации , синхронизированной блокировка для кода, небольшое количество проблем синхронизации


Неповторно замок: замок спина, ждать (), оповещать (), notifyAll ()

Неповторно замок, который не может вызываться рекурсивно, рекурсивный вызов тупиковый вытекает


2, ReentrantLock и синхронизироваться разница

ReentrantLock имеет ту же синхронизированный параллелизм и памяти семантики, в дополнении к замкам с несколькими столбцов голоса, прерывание блокировки времени ожидания и ожидание

Используйте синхронизированные блокировки, А не отпускает, B будет ждать вечно

Используйте блокировку ReentrantLock, А не отпускает, B будет ждать в течение некоторого времени ожидания прерывания времени, и делать другие вещи.


синхронизируются в уровне JVM , реализованная на, может не только контролировать синхронизированный замок, но исключение , когда код выполняется, JVM релиз , который выйдет через несколько запирающих инструментов мониторинга. Но не Зафиксируйте

В конкурсе ресурсов не очень напряженная ситуации, синхронизируются производительность лучше , чем замок ReentrantLock и конкурентная ситуация, выполнение синхронного падения несколько раз, и для поддержания нормального ReentrantLock производительности.


  • анализ производительности

синхронизируются будет повторно закрутить , чтобы получить блокировку , ожидая в этом процессе нити не будет приостановлено , тем самым экономя накладные расходы и приостановить переключение контекста пробуждения

И ReentrantLock , не прядут, а непосредственно повесить

Таким образом, в случае небольшого количества одновременных потоков, синхронизированное, поскольку они имеют спин замок, замок и легкий замок смещена причину, не ждать, пока нить повесить предвзятый замок даже без спина, поэтому в данном случае, чем reenttrantlock эффективным.


синхронизируется несправедливая блокировка по умолчанию; ReentrantLock не по умолчанию справедливых замков.


  • Связывание нескольких условий

ReentrantLock объект может одновременно связать несколько объектов Condition,

В синхронизируются, блокировка объекта wait(), а также notify()или notifyAll()методы могут быть реализованы в скрытом состоянии.

Если вы хотите добавить ассоциацию и более чем один раз, синхронизированные пришлось добавить дополнительный замок, и ReentrantLock нет необходимости делать нужно вызвать несколько так только new Condition()методы может быть.


рекомендация

отjuejin.im/post/5db943fd51882564635002c2