Apa itu Lock(), UnLock(), ReentrantLock(), TryLock() dan Apa bedanya dengan Synchronized Block di Java?]
Diterbitkan: 2020-07-05
Dalam tutorial ini kita akan membahas Lock(), UnLock(), ReentrantLock(), TryLock() dan perbedaannya dengan Synchronized Block di Java.
Jika Anda juga memiliki pertanyaan di bawah ini maka Anda berada di tempat yang tepat.
- Kunci di Jawa
- Contoh Kunci Java dan Kunci Konkurensi vs disinkronkan
- Tutorial Java Concurrency – Reentrant Locks
- sinkronisasi – Penggunaan kunci/buka kunci yang tepat untuk Java
- java – Sinkronisasi vs Kunci
- contoh buka kunci kunci java
- mekanisme penguncian di java
- kunci java membuka utas yang berbeda
Mari kita mulai. Pertama mari kita pahami masing-masing istilah ini dan kemudian kita akan membahas contoh kerjanya.
Kunci():
java.util.concurrent.locks
. Kunci adalah mekanisme sinkronisasi utas seperti blok yang disinkronkan kecuali kunci bisa lebih canggih daripada blok tersinkronisasi Java. Ini adalah antarmuka dan kelas yang menyediakan kerangka kerja untuk mengunci dan menunggu kondisi yang berbeda dari sinkronisasi dan monitor bawaan.
Membuka kunci():
UnLock() melepaskan kunci pada Object.
ReentrantLock():
ReentrantLock
dimiliki oleh utas yang terakhir berhasil mengunci, tetapi belum membukanya. lock
pemanggil utas akan kembali, berhasil memperoleh kunci, ketika kunci tidak dimiliki oleh utas lain. Metode akan segera kembali jika utas saat ini sudah memiliki kunci.
Kunci Coba():
TryLock() memperoleh kunci hanya jika itu gratis pada saat pemanggilan.
Tip-1
Jika Anda hanya mengunci objek, saya lebih suka menggunakan synchronized.
1 2 3 |
Lock . lock ( ) ; youMethod ( ) ; // Throws a NullPointerException! Lock . unlock ( ) ; // Here you never release the lock! |
Sedangkan dengan disinkronkan, sangat jelas dan tidak mungkin salah:
1 2 3 |
synchronized ( myObject ) { doSomethingNifty ( ) ; } |
Contoh Detail:
- Buat kelas: CrunchifyLockTutorial.java
- Buat kelas dalam: Perusahaan dan CrunchifyLoop
- Dari Main buat dua objek kelas Perusahaan
- Mulai loop utas untuk 10 pada objek itu
- Saat Company1 berbicara dengan Company2 – ia mengunci sebuah objek. Jika pada saat yang sama – jika
Company2
ingin berbicara denganCompany1
maka dikatakan – Bertentangan – Kunci sudah ada. (Kedua perusahaan sudah dalam pembicaraan).
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 ( ) ) ; } } } } |
Keluaran:
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 |
Tip-2

Anda dapat mencapai semua yang dilakukan utilitas di java.util.concurrent
dengan primitif tingkat rendah seperti synchronized
, volatile
, atau wait
.