Lock(), UnLock(), ReentrantLock(), TryLock() nedir ve Java'daki Senkronize Bloktan farkı nedir?]
Yayınlanan: 2020-07-05
Bu eğitimde Lock(), UnLock(), ReentrantLock(), TryLock() ve Java'daki Senkronize Bloktan nasıl farklı olduğunu inceleyeceğiz.
Sizin de aşağıdaki sorularınız varsa doğru yerdesiniz.
- Java'daki kilitler
- Java Kilidi Örneği ve Eşzamanlılık Kilidi vs senkronize
- Java Eşzamanlılık Eğitimi – Reentrant Kilitleri
- senkronizasyon – Java için uygun kilitleme/kilit açma kullanımı
- java – Senkronizasyon ve Kilitleme
- java kilit açma örneği
- java'da kilitleme mekanizması
- java kilidi farklı iş parçacığının kilidini aç
Başlayalım. İlk önce bu terimlerin her birini anlayalım ve sonra çalışma örneğini gözden geçirelim.
Kilit():
java.util.concurrent.locks
. Kilit, senkronize bloklar gibi bir iş parçacığı senkronizasyon mekanizmasıdır, ancak kilitler Java'nın senkronize bloklarından daha karmaşık olabilir. Yerleşik senkronizasyon ve monitörlerden farklı koşulları kilitleme ve bekleme için bir çerçeve sağlayan bir arayüz ve sınıflardır.
Kilidini aç():
UnLock(), Object üzerindeki kilidi serbest bırakır.
ReentrantLock():
Bir ReentrantLock
, en son başarıyla kilitlenen, ancak henüz kilidini açmayan iş parçacığına aittir . Kilit başka bir iş parçacığına ait olmadığında, bir iş parçacığı çağırma lock
geri döner ve kilidi başarıyla alır. Geçerli iş parçacığı zaten kilide sahipse, yöntem hemen dönecektir.
TryLock():
TryLock(), yalnızca çağrı sırasında boşsa kilidi alır.
İpucu-1
Yalnızca bir nesneyi kilitliyorsanız, synchronized.
1 2 3 |
Lock . lock ( ) ; youMethod ( ) ; // Throws a NullPointerException! Lock . unlock ( ) ; // Here you never release the lock! |
Senkronize ile, çok net ve yanlış yapmak imkansız:
1 2 3 |
synchronized ( myObject ) { doSomethingNifty ( ) ; } |
Örnek Ayrıntılar:
- Sınıf oluşturun: CrunchifyLockTutorial.java
- İç sınıflar oluşturun: Şirket ve CrunchifyLoop
- Main'den, Company sınıfının iki nesnesini oluşturun
- Bu nesnelerde 10 için iş parçacığı döngüsünü başlat
- Şirket1, Şirket2 ile konuşurken – bir nesneyi kilitler. Aynı zamanda – eğer
Company2
ile konuşmak istiyorsa o zaman –Company1
– Kilit zaten var diyor. (Her iki şirket de zaten konuşuyor).
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 |
package crunchify . com . tutorial ; import java . util . Random ; import java . util . concurrent . locks . Lock ; import java . util . concurrent . locks . ReentrantLock ; /** * @author Crunchify.com * */ public class CrunchifyLockTutorial { public static void main ( String [ ] args ) { final Company crunchify = new Company ( "Crunchify" ) ; final Company google = new Company ( "Google" ) ; new Thread ( new CrunchifyLoop ( crunchify , google ) ) . start ( ) ; new Thread ( new CrunchifyLoop ( google , crunchify ) ) . start ( ) ; } // Class CrunchifyLoop static class CrunchifyLoop implements Runnable { private Company companyName1 ; private Company companyName2 ; public CrunchifyLoop ( Company companyName1 , Company companyName2 ) { this . companyName1 = companyName1 ; this . companyName2 = companyName2 ; } public void run ( ) { Random random = new Random ( ) ; // Loop 10 for ( int counter = 0 ; counter < = 10 ; counter ++ ) { try { Thread . sleep ( random . nextInt ( 5 ) ) ; } catch ( InterruptedException e ) { } companyName2 . crunchifyTalking ( companyName1 ) ; } } } // Class Company static class Company { private final String companyName ; // ReentrantLock: Creates an instance of ReentrantLock. This is equivalent to using ReentrantLock(false) private final Lock lock = new ReentrantLock ( ) ; // Constructor public Company ( String name ) { this . companyName = name ; } public String getName ( ) { return this . companyName ; } public boolean isTalking ( Company companyName ) { Boolean crunchifyLock = false ; Boolean googleLock = false ; try { // tryLock: Acquires the lock only if it is free at the time of invocation. crunchifyLock = lock . tryLock ( ) ; googleLock = companyName . lock . tryLock ( ) ; } finally { if ( ! ( crunchifyLock && googleLock)) { if (crunchifyLock) { // unlock: Releases the lock. lock.unlock(); } if ( googleLock ) { companyName . lock . unlock ( ) ; } } } return crunchifyLock && googleLock; } public void crunchifyTalking ( Company companyName ) { // Check if Lock is already exist? if ( isTalking ( companyName ) ) { try { System . out . format ( "I'm %s: talking to %s %n" , this . companyName , companyName . getName ( ) ) ; } finally { lock . unlock ( ) ; companyName . lock . unlock ( ) ; } } else { System . out . format ( "\tLock Situation ==> I'm %s: talking to %s, but it seems" + " we are already talking. Conflicting. %n" , this . companyName , companyName . getName ( ) ) ; } } } } |
Çıktı:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
I 'm Crunchify: talking to Google Lock Situation ==> I' m Google : talking to Crunchify , but it seems we are already talking . Conflicting . I 'm Google: talking to Crunchify I' m Google : talking to Crunchify I 'm Crunchify: talking to Google I' m Google : talking to Crunchify I 'm Google: talking to Crunchify I' m Crunchify : talking to Google Lock Situation == > I 'm Google: talking to Crunchify, but it seems we are already talking. Conflicting. Lock Situation ==> I' m Crunchify : talking to Google , but it seems we are already talking . Conflicting . Lock Situation == > I 'm Google: talking to Crunchify, but it seems we are already talking. Conflicting. I' m Crunchify : talking to Google I 'm Google: talking to Crunchify I' m Google : talking to Crunchify I 'm Crunchify: talking to Google I' m Google : talking to Crunchify Lock Situation == > I 'm Google: talking to Crunchify, but it seems we are already talking. Conflicting. Lock Situation ==> I' m Crunchify : talking to Google , but it seems we are already talking . Conflicting . I 'm Crunchify: talking to Google I' m Crunchify : talking to Google I 'm Crunchify: talking to Google I' m Crunchify : talking to Google |
İpucu-2

java.util.concurrent
içindeki yardımcı programların yaptığı her şeyi, synchronized
, volatile
veya wait
gibi düşük seviyeli temel öğelerle gerçekleştirebilirsiniz.