ثخحول اىل ىذه احلاهل " ،" Thread blockedثنذظر " غندما يريد " "Threadان يلوم بلراءة
راءة من ملف او معلية ، I\Oفيي
امـ "resourceاىل ان يخاح ميا وثلوم ابمؼمل اخلاص هبا .
نلـ " " runفيي ثنهتي بهناية ىذه methodواليصبح ميا وحود ، thread ىذه احلاة يه ما بؼد ثنفيذ
" مؼني ومل يخحصل " Threadيريد ان يعلب "object يف اجلافا ،لك " "objectهنش ئو هل lockخاص بو ،يف ىذه احلاة امـ
". ػىل " "lockاخلاص بو مبؼىن ىناك Threadأخر دلهيا امـ" "lockهفسو اخلاص هبذا "object
releaseنلـ" "lockميخحصل ػليو thread فان ىذا threadيخحول اىل waiting stateاىل ان يلوم threadالول بؼمل
امثاين ،يف حاة ظلب " " threadمــ " "waitمن threadالول فيي حكون يف ىذه احلاهل حىت يؼمل threadأخر" notify
" هل ،مث ثذىب اىل ready stateمره أخرى.
" يه keywordيف اجلافا ،هممهتا امضامن ػىل ػدم دخول سوا مــ " "threadواحده "
" ." at one timeو ميكن ثعبيليا ػىل methodأو ػىل "" block of code
{ class Example implements Runnable
{ )(public void run
;)(go }
{)(public synchronized void go
// guarantee only one thread enter this method at atime
}}
سوى thread " ,هيف ثضمن اهو اليوخد "synchronized ماذا مو ننت ثؼمل ػىل objectأو ػىل " "methodميست
واحده يدخل مؼمل هممة ما ؟
{ class Example2 implements Runnable
;"String str = "CheckThat
{ )(public void run
};)(go
{)(public void go
{)synchronized(s
;)" s = [Link](" I_See
}}}
{ class A implements Runnable
{ )(public void run
;)(go
}
{)(public synchronized void go
// guarantee only one thread enter this method at atime
}}
دليم خشصان يريدان حسب كمية 055دوالر من احلساب ،واحلساب حامي ًا "" balance =500
دلينا ( )two threadsس يدخل الاول واذلي ميثهل حسني ،ويف اثناء دخوهل دخل امثاين ومخكن زمزم ,الآن حسني و زمزم لكهيام
مذأندين ابن ىناك كمية 055دوالر ابحلساب وكابةل نلسحب وسوف يلومان ابمسحب ،مكن املشلكو اهو غندما حسب حسني اصبح
امرصيد صفر ،ومكن زمزم منذ حلظات داخل املنظومة واػلمهتا ان ىناك رصيد كابل نلسحب ،وملسف ثخفاحئ زمزم بأن املنظومة
اخابهتا اليوخد رصيد اكيف ,مع امؼمل ان املنظومة منذ كليل أخابخو اهو يوخد رصيد نلسحب.
ماحلل ؟
احلل ىو اهو غندما يدخل أي threadيف " " withdraw methodجنؼل امرصيد مكل ميذه امـ " " threadوىو يف ىذه
احلاة ميثهل حسني ,اي ثريد أخرى ( مثل زمزم) حريد ان ثؼمل withdrawجنؼليا يف waiting listوغندما ينهتي حسني هؼمل
notifyميا.
}synchronized withdraw(int i) {//code_here
لك " "objectيف اجلافا هل lockخاص بو ،ذلكل اول مايدخل حسني الى synchronized methodيأخذ " الـ "lockميذا
objectميذا امـ , .Accountوالحيق لي أحد أآخر سواء زمزم أو أي threadأخرى ان ثدخل أي synchronized block
،ومكن ميا احلق ان ثدخلany non-synchronized block
يه حاهل ثأيت أحيا ًن غندما يكون دلينا "." two threads or more
مو دلينا thread-Aو .thread-Bومو فرضنا ان thread-Aداخل يف synchronized blockوىذا يؼين أن
thread-Aدليو lockاخلاص " "objectاحلايل والجس خعيع أي " " threadأخر ادلخول ميذا امبلوك من امكود .فلو خاء
thread-Bويريد هفس " "objectسوف ينذظر اىل ان thread-Aخيرج ويؼمل releaseنلـ . lock
ومكن املشلكو ىنا ،ماذا مو اكهت thread-Aحريد " " objectاذلي ميلكو الآن ، thread-Bسوف ثذىب اىل "
." waiting listمكن ابمللابل thread-Bىو يريد ايض ًا " " objectاذلي ميلكو ، thread-Aفلك واحد مهنم ينذظر الآخر ان
يخخلئ غن " ، " lockحىت يأخذه ،ومس خحيل يخلابالن لن هيليام waitingوينذظر الآخر مخحرير انلـ lockحىت يأخذه.
غندما. "object" نلـlock والميكن مناداهتام اال اذا ننت متكلsynchronized code " جس خخدم داخلwait & notify "
."واحدobject" ةالثنان يشرتاكن يفtwo thread يوخد دليم
public class Main {
public static void main(String [] args){
new Target(); }}
class A {
public int value = 0;}
class Target {
A chech = new A();
Target(){
Thread thread1 = new Thread(new Check());
Thread thread2 = new Thread(new Increment());
[Link]("Start Threads !!");
[Link]();
[Link](); }
class Check implements Runnable {
public void run() {
synchronized(chech){
for(int i = 0; i < 5; i++){
try {
[Link]("value is "+[Link]);
[Link]();}
catch(InterruptedException ex) { [Link](); }
[Link]();
}}}}
class Increment implements Runnable {
public void run() {
synchronized(a){
for(int i=0;i<5;i++){
[Link]++;
[Link]("Increment 1");
[Link]();
try {
[Link](); }
catch(InterruptedException ex){[Link]();}
}}}}
واحد ,أي س خحخاج اىل اس خخدامThreads. غند برجمة ثعبيق هبري فاهم حامتً س خحخاج اىل ثنفيذ ػدة أوامر يف وكت
مفث ًال كد جتؼل برنجمم يخؼامل مع كاػدة بيانت و يخصل ابمنت يف هفس اموكت .ىنا س خضعر اىل ثنفيذ لك معلية مهنم
مضن Threadخمخلف حىت حمتكن من جشغيليم يف هفس اموكت.
جشغيل ػدة Threadsيف هفس اموكت كد ينــخج غنو مشلكة امخضارب ) ( Conflictو اميت حتدث غند وحود
اثنني Threadsينفذان هفس المر يف هفس اموكت أي وصلوا اىل مرحةل أصبح فهيا لك Threadمهنم حباخة اىل اس خخدام يشء
يس خخدمو امـ Threadالآخر.
فؼلي ًا ,مشلكة امخضارب حتدث يف حال مل جنؼل امـ Threadsيؼملون بشلك مزتامن ( )Synchronizedاذا اكهوا
سيس خخدمون بؼض املصادر املشرتنة أثناء معليم.
مجيع الش ياء املخوفرة يف امـ Swingو اميت ميكن اضافهتا يف امنافذة ال ثنفذ بشلك مزتامن المر اذلي كد يؤدي اىل ثؼليق امربنمج يف
حال اس خخدام Threadsيس خخدمون مصادر مشرتنة.
ثوخد ظريلذني حلل مشلكة املزامنة
امعريلة الوىل :اخلعوات اميت ػليم فؼليا يف حال ننت ال حريد وراثة امالكسJFrame:
افؼل importنلالكس .SwingUtilities
مق ببناء داة هوغيا private static voidو أغعيا أي امس حريد ,مث ضع فهيا لك امكود اذلي جيب أن حكذبو مبناء امنافذة.
يف ادلاة )( mainمق ابس خدػاء ادلاة )( invokeLaterو مرر ميا اكئن من االهرتفيس Runnableو امعل "" Override
ندلاة )( runو احؼليا فلط جس خدغ ادلاة اميت ثبين امنافذة.
;import [Link]
{ public class Test
{ )(private static void createAndShowGUI
}
{ )public static void main(String[] args
{ )([Link](new Runnable
@Override
{ )(public void run
;)(createAndShowGUI
}
}} ;)}
امعريلة امثاهية :اخلعوات اميت ػليم فؼليا يف حال ننت حريد وراثة امالكسJFrame:
افؼل importنلالكس .SwingUtilities
مق بوارثة امالكس .JFrame
مق ببناء داة هوغيا private voidو أغعيا أي امس حريد ,مث ضع فهيا لك امكود اذلي جيب أن حكذبو مبناء امنافذة.
احؼل امكووسرتنخور يس خدغ ادلاة اميت ثلوم ببناء امنافذة.
يف ادلاة )( mainمق ابس خدػاء ادلاة )( invokeLaterو مرر ميا اكئن من االهرتفيس Runnableو افؼل Overrideندلاة
)( , runمث مق ابوشاء اكئن من امالكس ,و غندىا س يلوم امكووسرتنخور ابس خدػاء ادلاة اميت ثبين امنافذة.
;import [Link]
;import [Link]
{ public class Test extends JFrame
{ )(public Test
} ;)(createAndShowGUI
} { )(private void createAndShowGUI
{ )public static void main(String[] args
{ )([Link](new Runnable
@Override
{ )(public void run
} ;)(new Test
}};)}
مالحظة
اذا ننت جس خخدم امـ GUI Builderاملوحود يف برنمج امـ Net Beansمبناء واهجة املس خخدم ,س خالحغ أهو يراغ مشلكة
املزامنة اذا اظلؼت ػىل الوامر اميت يكذهبا لكام أضفت شيا ًا خديد ًا.
نام أهو يلوم بدسمية ادلاة اميت يضع فهيا هود اوشاء امنافذةinitComponents().