В этом уроке мы расскажем о Lock (), UnLock (), ReentrantLock (), TryLock () и о том, чем он отличается от Synchronized Block в Java .
Если у вас есть также вопросы ниже, то вы находитесь в правильном месте.
- Замки в Java
- Пример блокировки Java и блокировки параллелизма против синхронизации
- Учебник по параллелизму Java — повторяющиеся блокировки
- синхронизация — правильное использование блокировки / разблокировки для Java
- Синхронизация против блокировки
- Пример разблокировки Java блокировки
- механизм блокировки в Java
- java lock разблокировать другой поток
Давайте начнем. Сначала давайте разберемся с каждым из этих терминов, а затем перейдем к рабочему примеру .
Замок():
java.util.concurrent.locks , Блокировка — это механизм синхронизации потоков, такой как синхронизированные блоки, за исключением того, что блокировки могут быть более сложными, чем синхронизированные блоки Java. Это интерфейсы и классы, предоставляющие основу для блокировки и ожидания условий, отличных от встроенной синхронизации и мониторов.
Unlock ():
UnLock () снимает блокировку с объекта .
ReentrantLock ():
ReentrantLock принадлежит потоку, который последний раз успешно блокировал, но еще не разблокировал его. Вызывающая нить lock вернется, успешно получив блокировку, когда блокировка не принадлежит другому потоку. Метод вернется немедленно, если текущий поток уже владеет блокировкой.
TryLock ():
TryLock () получает блокировку, только если она свободна на момент вызова.
Tip1: Если вы просто блокируете объект, я бы предпочел использовать synchronized.
|
1
2
3
|
Блокировка. блокировка ( ) ;
youMethod ( ) ; // Выдает исключение NullPointerException!
Блокировка. разблокировать ( ) ; // Здесь вы никогда не снимаете блокировку!
|
Принимая во внимание, что с синхронизированным , это супер ясно и невозможно ошибиться:
|
1
2
3
|
синхронизированный ( myObject ) {
doSomethingNifty ( ) ;
}
|
Детали примера:
- Создать класс: CrunchifyLockTutorial.java
- Создание внутренних классов : Company и CrunchifyLoop
- Из Main создайте два объекта класса Company
- Начать нить цикла для 10 на этих объектах
- Пока Company1 разговаривает с Company2 — она блокирует объект. Если в то же время — если
Company2хочет поговорить сCompany1тогда он говорит — Конфликт — Блокировка уже существует. (Обе компании уже ведут переговоры).
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
пакет crunchify. ком . учебник ;
Импортировать Java. Util. Случайный ;
Импортировать Java. Util. одновременно. замки . Замок ;
Импортировать Java. Util. одновременно. замки . ReentrantLock ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyLockTutorial {
общественности статический недействительным main ( Строка [ ] аргументы ) {
окончательный Компания хрустит знак равно новый Компания ( Хруст ) ;
окончательный Компания Google знак равно новый Компания ( «Google» ) ;
новый Тема ( новая CrunchifyLoop ( crunchify , гугл ) ) . начало ( ) ;
новый Тема ( новая CrunchifyLoop ( Google , хрустеть ) ) . начало ( ) ;
}
// Класс CrunchifyLoop
статический учебный класс CrunchifyLoop инвентарь Runnable {
частный Компания companyName1 ;
частный Компания companyName2 ;
общественности CrunchifyLoop ( Компания companyName1 , Компания companyName2 ) {
это. companyName1 знак равно companyName1 ;
это. companyName2 знак равно companyName2 ;
}
общественности недействительным запустить ( ) {
Случайный случайный знак равно новый Случайный ( ) ;
// цикл 10
за ( int счетчик знак равно 0 ; счетчик < = 10 ; counter ++ ) {
пытаться {
Thread. сон ( случайный . nextInt ( 5 ) ) ;
} ловить ( InterruptedException е ) {
}
companyName2 . crunchifyTalking (companyName1);
}
}
}
// Класс Компания
статический учебный класс Компания {
частный окончательный строка companyName ;
// ReentrantLock: Создает экземпляр ReentrantLock. Это эквивалентно использованию ReentrantLock (false)
частный окончательный Блокировка замка знак равно новый ReentrantLock ( ) ;
// Конструктор
общественности Компания ( Строка имя ) {
это. название компании знак равно имя ;
}
общественности строка getName ( ) {
вернуть это. companyName ;
}
общественности логический isTalking ( Компания companyName ) {
логический crunchifyLock знак равно ложь ;
логический googleLock знак равно ложь ;
пытаться {
// tryLock: получает блокировку, только если она свободна на момент вызова.
crunchifyLock знак равно блокировки. tryLock ( ) ;
googleLock знак равно companyName . блокировки. tryLock ( ) ;
} в конце концов {
если ( ! ( crunchifyLock && googleLock)) {
if (crunchifyLock) {
// разблокировать: снимает блокировку.
lock.unlock ();
}
если ( googleLock ) {
companyName . блокировки. разблокировать ( ) ;
}
}
}
вернуть crunchifyLock && googleLock;
}
общественности недействительным crunchifyTalking ( Компания companyName ) {
// Проверить, существует ли блокировка?
если (IsTalking (COMPANYNAME)) {
пытаться {
Система. вне. формат ( «Я% s: общаюсь с% s% n» , это. companyName , companyName . getName ( ) ) ;
} в конце концов {
блокировки. разблокировать ( ) ;
companyName . блокировки. разблокировать ( ) ;
}
} еще {
Система. вне. format ( / tLock ситуаций ==> Я% s: разговариваю с% s, но похоже
+ «Мы уже говорим. Конфликтует.% n» , это. companyName , companyName . getName ( ) ) ;
}
}
}
}
|
Выход:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Я Crunchify: общаюсь с Google
Замок Ситуация ==> Я»м Google : говорить с Хруст , но, кажется , мы уже говорили. Противоречивые.
Я Google: общаюсь с Crunchify
Я»м Google : говорить с Crunchify
Я Crunchify: общаюсь с Google
Я»м Google : говорить с Crunchify
Я Google: общаюсь с Crunchify
Я»м Хрустеть : говорить с Google
Блокировка ситуации == > Я Google: разговариваю с Crunchify, но, кажется, мы уже разговариваем. Противоречивые.
Замок Ситуация ==> Я»м Хрустеть : говорить с Google , но, кажется , мы уже говорили. Противоречивые.
Блокировка ситуации == > Я Google: разговариваю с Crunchify, но, кажется, мы уже разговариваем. Противоречивые.
Я»м Хрустеть : говорить с Google
Я Google: общаюсь с Crunchify
Я»м Google : говорить с Crunchify
Я Crunchify: общаюсь с Google
Я»м Google : говорить с Crunchify
Блокировка ситуации == > Я Google: разговариваю с Crunchify, но, кажется, мы уже разговариваем. Противоречивые.
Замок Ситуация ==> Я»м Хрустеть : говорить с Google , но, кажется , мы уже говорили. Противоречивые.
Я Crunchify: общаюсь с Google
Я»м Хрустеть : говорить с Google
Я Crunchify: общаюсь с Google
Я»м Хрустеть : говорить с Google
|
Tip2: Вы можете достичь всего, что утилиты в java.util.concurrent делать с примитивами низкого уровня, такими как synchronized , volatile , или же wait ,
0.00 (0%) 0 votes








