ما هو Lock () و UnLock () و ReentrantLock () و TryLock () وكيف يختلف عن Block Synchronized Block في Java؟]
نشرت: 2020-07-05
في هذا البرنامج التعليمي ، سننتقل إلى Lock () و UnLock () و ReentrantLock () و TryLock () وكيف يختلف عن Synchronized Block في Java.
إذا كانت لديك أيضًا أسئلة أدناه ، فأنت في المكان الصحيح.
- أقفال في جافا
- مثال على قفل Java و Concurrency Lock مقابل المزامنة
- برنامج Java Concurrency Tutorial - Reentrant Locks
- التزامن - الاستخدام المناسب للقفل / فتح القفل لجافا
- جافا - التزامن مقابل لوك
- جافا قفل سبيل المثال
- آلية القفل في جافا
- جافا قفل فتح موضوع مختلف
هيا بنا نبدأ. أولاً ، دعنا نفهم كل من هذه المصطلحات ثم سنستعرض مثال العمل.
قفل():
java.util.concurrent.locks
. القفل عبارة عن آلية لمزامنة الخيط مثل الكتل المتزامنة باستثناء أن الأقفال يمكن أن تكون أكثر تعقيدًا من الكتل المتزامنة في Java. وهي عبارة عن واجهات وفئات توفر إطارًا للقفل والانتظار للظروف التي تختلف عن المزامنة والشاشات المضمنة.
الغاء القفل():
حرر UnLock () القفل الموجود على الكائن.
ReentrantLock ():
ReentrantLock
مملوك من قبل الخيط الأخير الذي تم قفله بنجاح ، ولكن لم يتم إلغاء قفله بعد. سيعود lock
استدعاء الخيط ، والحصول على القفل بنجاح ، عندما لا يكون القفل مملوكًا لخيط آخر. ستعود الطريقة فورًا إذا كان الخيط الحالي يمتلك القفل بالفعل.
TryLock ():
يكتسب TryLock () القفل فقط إذا كان مجانيًا وقت الاحتجاج.
نصيحة 1
إذا كنت تقوم ببساطة بقفل كائن ما ، فأنا أفضل استخدام synchronized.
1 2 3 |
Lock . lock ( ) ; youMethod ( ) ; // Throws a NullPointerException! Lock . unlock ( ) ; // Here you never release the lock! |
بينما مع المزامنة ، من الواضح جدًا ومن المستحيل أن تخطئ:
1 2 3 |
synchronized ( myObject ) { doSomethingNifty ( ) ; } |
تفاصيل المثال:
- إنشاء فئة: CrunchifyLockTutorial.java
- قم بإنشاء فصول داخلية: شركة و CrunchifyLoop
- من الرئيسية إنشاء كائنين من فئة الشركة
- ابدأ حلقة الخيط لمدة 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 |
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 ( ) ) ; } } } } |
انتاج:
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 |
نصيحة 2

يمكنك تحقيق كل ما تفعله الأدوات المساعدة في java.util.concurrent
منخفضة المستوى مثل synchronized
أو volatile
أو wait
.