ما هو سيمافور في جافا واستخداماته؟



يتم استخدام إشارة لمزامنة العمليات. ستوجهك هذه المدونة عبر الأنواع المختلفة للإشارات وتنفيذها في جافا.

إشارة في يتحكم في الوصول إلى مورد مشترك من خلال عداد. إنها تزامن الموضوع بناء يستخدم لإرسال إشارات بين الخيوط لتجنب الإشارات المفقودة أو حماية قسم حرج. في هذه المدونة على Semaphores في Java ، سوف نفهم المفهوم بالتفصيل.
سيتم تناول الموضوعات التالية في هذه المدونة:

ابحث عن أكبر رقم في المصفوفة

ما هو سيمافور في جافا؟

السيمافور هو متغير يستخدم لمزامنة العمليات التي تستخدم لإدارة العمليات المتزامنة. يتم استخدامه أيضًا للتحكم في الوصول إلى مورد مشترك من خلال عمليات متزامنة متعددة وتجنب حالة السباق.





أنواع السيمافور -

  • إشارة ثنائية: إشارة ثنائية تأخذ فقط 0 و 1 كقيم وتستخدم لتنفيذ الاستبعاد المتبادل وكذلك مزامنة العمليات المتزامنة.

  • عد الإشارة: تشير قيمة إشارة الجرد في أي وقت إلى الحد الأقصى لعدد العمليات التي يمكن أن تدخل القسم الحرج في نفس الوقت بالضبط.



عمل سيمافور

  • إذا كان عدد الإشارات> 0 ، فإن الخيط يكتسب تصريحًا ، مما يقلل من عدد الإشارات.

  • عدا ذلك ، فإن تم حظره حتى يمكن الحصول على تصريح.

  • عندما لا يحتاج مؤشر الترابط إلى الوصول إلى مورد مشترك ، فإنه يطلق التصريح ، ويزيد من عدد الإشارات.



  • إذا كان هناك خيط آخر ينتظر التصريح ، فسيحصل هذا الخيط على تصريح في ذلك الوقت.

تنفيذ سيمافور

import java.util.concurrent. * // سوف نأخذ الموارد كفئة مشتركة Resource {static int count = 0} class MyDemo يمتد العرض {Semaphore sem String threadName العام MyDemo (Semaphore sem، String threadName) {super (threadName) هذا sem = sem this.threadName = threadName}Override public void run () {// Run By X if (this.getName (). يساوي ('X')) {System.out.println ('بدء' + threadName) جرب {// هل ستحصل على إذن للوصول إلى المورد المشترك System.out.println (threadName + 'انتظار تصريح.') // الحصول على sem.acquire () القفل System.out.println (threadName + 'يحصل على تصريح . ') // الآن ، سينتظر الوصول إلى المورد المشترك والباقي (int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

انتاج-
ابتداء من X
ابتداء من Y
X في انتظار تصريح
Y في انتظار تصريح
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X يطلق التصريح
Y يحصل على التصريح
ص: 6
ص: 5
ص: 4
ص: 3
ص: 2
ص: 1
ص: 0
وإطلاق التصريح
العد: 0

بهذا نصل إلى نهاية هذه المدونة حول 'Semaphores in Java'. إذا كنت ترغب في معرفة المزيد عن Java ، تحقق من من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

وظيفة الانقسام في مثال جافا

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في مدونة 'What is Semaphore in Java' وسنقوم بالرد عليك في أقرب وقت ممكن.