(38)

Другой замок блокировки резьбы

Блокировка и синхронизируется разница:

  1 ) Блокировка не является Java языка встроенного, синхронизированный является Java языка ключевого слова , и поэтому встроенные функции. Блокировка являются java.util.concurrent.locks пакет обычно используются классы (интерфейсы) , могут быть синхронизированы доступны через этот класс;

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

Блокировка интерфейса:

 

открытый интерфейс блокировки {

 

    аннулируются замок (); // получение блокировки

 

    аннулированию lockInterruptibly () бросает InterruptedException; // получить блокировку, и, при ожидании блокировки может быть прервано ожидание

 

    булево tryLock ();

 

    булево tryLock (долгое время, TimeUnit блок) бросает InterruptedException;

 

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

 

    }

 

 

 

Блокировка интерфейса для каждого способа использования:

 

Блокировка () , tryLock () , tryLock (Long Time, TimeUnit Unit) , lockInterruptibly в () используется для получения блокировки. UNLOCK () метод используется для снятия блокировки.

 

 

 

Четыре блокировки метода получения разницы между:

 

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

 

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

 

 

 

tryLock () метод возвращает значение , которое представляет для пытаться получить блокировку, если приобретение успешно, возвращение к истинным , если не удается приобретение (то есть, замок был приобретен другим потоком), она возвращает ложь , сказал этот метод все равно Он будет немедленно вернуться . Я не придется ждать , что когда не получить блокировку.

 

 

 

  tryLock (долгое время, TimeUnit блок) метод и tryLock () метод аналогичен, но разница в том , что этот метод , когда замок не денется ждать какое - то время, если он не может получить блокировку, он возвращается в течение периодов времени ложь . Если вы получите , если вы начнете получать блокировку или блокировку в период ожидания, он возвращается к истине .

 

 

 

  lockInterruptibly () метод, а специальный, когда приобрести Заблокируй этот путь, если поток ожидает получить блокировку, то нить может ответить на прерывание, латентность прерывания , что является состоянием резьбы . Так он говорит , что , когда два потока одновременно lock.lockInterruptibly () , когда вы хотите получить блокировку, если на этот раз поток получает блокировку, и поток B только ждать, то поток B вызывает threadB.interrupt () метод может прерывания потока B процесс ожидания.

 

  Обратите внимание , что , когда поток получает блокировку, не будет прерывания () прерывает метод.

 

  Поэтому , когда на lockInterruptibly () получает метод блокировки, если вы не можете получить, только случай , когда ожидание прерывания.

 

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

 

 

 

ReentrantLock

 

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

 

 

ReentrantLock случаи использования:

(. 1) Блокировка () надлежащее использование

 

импорт java.util.ArrayList;
импорт java.util.concurrent.locks.Lock;
импорт java.util.concurrent.locks.ReentrantLock;

 

общественного класса MyLockTest {
       частный статический ArrayList <Integer> ArrayList = новый ArrayList <Integer> ();
       статическая блокировка блокировка = новый ReentrantLock (); //锁对象
       открытые статические <E> силы основных (String [] арг) {
               новый Thread () {
                       общественного недействительными запуска () {
                              Тема = Thread.currentThread ();
                              lock.lock ();
                              попробуйте {
                                   System.out.println (thread.getName () + "得到了锁");
                                   для (INT I = 0; г <5; я ++) {
                                         arrayList.add (I);
                                    }
                              Улов} (Исключение Е) {
                                    // TODO: Исключение ручка
                             } окончательно {
                                   System.out.println (Thread.getName () + "снятие блокировки");
                                   lock.unlock (); // блокировка выпуска
                              }

 

                       };
               }.Начните();

               Новая тема () {
                       общественного недействительными запуска () {
                              Тема = Thread.currentThread ();
                               lock.lock ();
                               попробуйте {
                                     System.out.println (thread.getName () + "得到了锁");
                                     для (INT I = 0; г <5; я ++) {
                                           arrayList.add (I);
                                      }
                                 } Поймать (Exception е) {
                                      // TODO: ручка исключение
                                 , Наконец , {}
                                      System.out.println (Thread.getName () + "разблокировки");
                                      lock.unlock ();
                                 }

 

                        };
                }.Начните();
      }

 

}

(2) tryLock () , чтобы использовать

 


импорт java.util.ArrayList;
импорт java.util.concurrent.locks.Lock;
импорт java.util.concurrent.locks.ReentrantLock;

 

/ **
* Наблюдаемое явление: После того, как поток получает блокировку, другой поток не блокировать, не придется ждать
* @author
*
* /
класс MyTryLock общественности {

 

       частный статический ArrayList <Integer> ArrayList = новый ArrayList <Integer> ();
       статическая блокировка блокировка = новый ReentrantLock (); //注意这个地方
       государственной статической силы основных (String [] арг) {

               новый Thread () {
               общественного недействительными запуска () {
                      Тема = Thread.currentThread ();
                      булева tryLock = lock.tryLock ();
                      System.out.println (thread.getName () +» , «+ tryLock);
                      если (tryLock) {
                           попробуйте {
                                 System.out.println (thread.getName () + "得到了锁");
                                 для (INT I = 0; г <5; я ++) {
                                      arrayList.add (я);
                                  }
                           } Улов (Исключение е) {
                                  // TODO: ручка исключение
                           } {наконец ,
                                 System.out.println (thread.getName () + "释放了锁");
                                 lock.unlock ();
                            }
                      }
               };
               }.Начните();

 

               Новая тема () {
                       общественного недействительными запуска () {
                              Тема = Thread.currentThread ();
                              булева tryLock = lock.tryLock ();
                              System.out.println (thread.getName () +» , «+ tryLock);
                              если (tryLock) {
                                    попробуйте {
                                          System.out.println (thread.getName () + "得到了锁");
                                          для (INT I = 0; г <5; я ++) {
                                                arrayList.add (I);
                                           }
                                      } Улов (Исключение е) {
                                          // TODO: ручка исключение
                                      } {наконец ,
                                           System.out.println (thread.getName () + "释放了锁");
                                           lock.unlock ();
                                      }
                                }

 

                        };
              }.Начните();
       }

 


}

(3) lockInterruptibly () в ответ на прерывание использования

 

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

отwww.cnblogs.com/paradis/p/11431347.html