المواضيع هي مفهوم مهم جدا في برمجة جافا وهذا المقال سوف يشرح ذلك بالتفصيل في شكل أمثلة. التحليل المحدد هو كما يلي:
بداية ما فائدة قفل الخيط؟ على سبيل المثال: على سبيل المثال، إذا كان لديك 30 ألف يوان في البنك الآن، وذهبت إلى البنك لسحب الأموال، فبعد إدخال كلمة المرور، تكون قد أدخلت مبلغ السحب بالفعل. على سبيل المثال، إذا أدخلت 20000، فسيتم ذلك يعني أن البنك سيحصل على المال نيابةً عنك، وفي ذلك الوقت ذهبت زوجتك أيضًا إلى البنك لسحب المال، وأنت تقوم زوجتي أيضًا بسحب مبلغ 20000، لأن حسابك لا يزال 30000 في هذا الوقت، لذلك يقوم البنك بنفس العملية من جانب زوجتك، وبهذه الطريقة، بعد إكمال العمليات الخاصة بك، يجب أن يظل البنك مسجلاً في حسابك بمبلغ 30000 إيداع بقيمة 10000 يوان، أليس هذا رائعًا؟ لحل هذه المشكلة، يتم استخدام معرفة قفل الخيط، فلنتعلمها معًا.
1. مثال على مزامنة مؤشر الترابط غير المعالج:
public class TextSync Implements Runnable{ /**مزامنة الخيط غير المعالجة* @param args */ Time time = new Time(); public static void main(String[] args) { TextSync text = new TextSync(); (text); Thread t2 = new Thread(text); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()) }}class Time { public static int num = 0; Try { num++; // عندما يتم تنفيذ الخيط الأول عند هذه النقطة، يصبح num 1، ويتوقف الخيط الأول مؤقتًا لمدة ثانية واحدة. // يبدأ تنفيذ الخيط الثاني عند هذه النقطة، ويصبح num. ويتوقف الخيط الثاني مؤقتًا لمدة ثانية واحدة. // يصبح رقم الخيط الأول أيضًا 2 في هذا الوقت، وبالتالي تكون النتيجة النهائية 2؛ Thread.sleep(1000); " هو "+num+"سلسلة التنفيذ." }}نتيجة الإخراج:
t2 هو الخيط الثاني للتنفيذ. t1 هو الخيط الثاني للتنفيذ.
2. مزامنة الموضوع
public class TextSynctwo Implements Runnable{ /**مزامنة الموضوع* @param args */ Time1 time = new Time1(); public static void main(String[] args) { TextSynctwo text = new TextSynctwo(); text); Thread t2 = new Thread(text); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); تقوم المزامنة بتأمين الخيط الحالي، والذي يمكن الإعلان عنه عند تعريف الطريقة أو تعيينها في الطريقة. public syncronized void add(String name){ // متزامن (هذا) {// اقفل الخيط الحالي لمنع تنفيذه بواسطة سلاسل رسائل أخرى حاول { num++; printStackTrace(); } System.out.println(name+"هو "+num+"خيط التنفيذ.");نتيجة الإخراج:
t1 هو الخيط الأول للتنفيذ. t2 هو الخيط الثاني للتنفيذ.
3. طريق مسدود
public class TestDeadLock Implements Runnable{ /**Deadlock* @param args */ Private int flag = 0; static Object o1 = new Object(); static Object(); { TestDeadLock td1 = new TestDeadLock(); TestDeadLock td2 = new TestDeadLock(); = 1; td2.flag = 2; الموضوع t1 = الموضوع الجديد(td1); t2.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()); if(flag == 1){ syncronized(o1){ حاول { Thread.sleep(5000 } Catch (InterruptedException e) { e.printStackTrace( } متزامن(o2){ System.out.println("1" } } } if(flag == 2){ متزامن(o2){ حاول { Thread.sleep(5000) } Catch (InterruptedException e) { e.printStackTrace() } syncronized(o1){ System.out.println("2" } } }};4. القفل
public class TT Implements Runnable{ /**Lock* @param args */ int b = 100; public static void main(String[] args) { TT tt = new TT(); .start(); حاول { tt.m2() } Catch (Exception e) { e.printStackTrace(); System.out.println(tt.b); } @Override public void run() { حاول { m1() } Catch (Exception e) { e.printStackTrace() } } يرمي استثناءً متزامنًا خاصًا { b = 1000; Thread.sleep(5000); System.out.println("b="+b}) رميات باطلة متزامنة خاصة استثناء { Thread.sleep(2500);الإخراج الآن هو:
1000ب=1000
يمكن ملاحظة أن m2 يتم تنفيذه أولاً، ولا يمكن تنفيذ m1 حتى اكتمال m2.
آمل أن تكون هذه المقالة مفيدة لتصميم برمجة Java للجميع.