Другой замок блокировки резьбы
Блокировка и синхронизируется разница:
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 () в ответ на прерывание использования