1 ما هي مشكلة التزامن.
عمليات متعددة أو مؤشرات الترابط التي تصل إلى نفس المورد في وقت واحد (أو في نفس الفترة الزمنية) سوف تسبب مشاكل التزامن.
مثال نموذجي هو أن اثنين من مشغلي البنوك يعملان على نفس الحساب في نفس الوقت. على سبيل المثال ، يقرأ المشغلون A و B حسابًا برصيدًا قدره 1000 يوان في نفس الوقت ، يضيف المشغل A 100 يوان إلى الحساب ، كما يقلل المشغل B من 50 يوانًا للحساب ، وترسع A First ، و B. الرصيد النهائي للحساب الفعلي هو 1000-50 = 950 يوان ، ولكن كان ينبغي أن يكون 1000+100-50 = 1050. هذه مشكلة تزامن نموذجية. كيف تحلها؟ يمكن استخدام الأقفال.
2 استخدام المزامنة في جافا
الاستخدام 1
اختبار الفئة العامة {public synchronized void print () {…. ؛}}إذا قام مؤشر ترابط بتنفيذ طريقة print () ، فسيتم قفل الكائن. لن تتمكن مؤشرات الترابط الأخرى من تنفيذ جميع الكتل المتزامنة للكائن.
الاستخدام 2
اختبار الفئة العامة {public void print () {synchronized (this) {// lock هذا الكائن ... ؛}}} نفس الاستخدام 1 ، لكنه يمكن أن يعكس بشكل أفضل جوهر الاستخدام المتزامن.
الاستخدام 3
اختبار الفئة العامة {private string a = "test" ؛ public void print () {synchronized (a) {// lock a object… ؛تنفيذ print () سوف قفل الكائن أ. لاحظ أنه لا يقفل كائن الاختبار ، مما يعني أن الطرق المتزامنة الأخرى لكائن الاختبار لن يتم قفلها بسبب print (). بعد تنفيذ كتلة رمز التزامن ، يتم إصدار القفل إلى A.
من أجل قفل كتلة التعليمات البرمجية لكائن ما دون التأثير على الكتابة عالية الأداء للكتل الأخرى المتزامنة للكائن:
اختبار الفئة العامة {private byte [] lock = new byte [0] ؛ public void print () {synchronized (lock) {...}} void t () {...}}قفل طريقة ثابتة
اختبار الفئة العامة {Public Synchronized Void execute () {... ؛}}نفس التأثير
اختبار الفئة العامة {public static void execute () {synchronized (testthread.class) {... ؛}}}3 أقفال في جافا وقائم انتظار للذهاب إلى المرحاض.
القفل هو وسيلة لمنع العمليات أو المواضيع الأخرى من الوصول إلى الموارد ، أي أنه لا يمكن الوصول إلى المورد المقفل من خلال الطلبات الأخرى. في Java ، يتم استخدام الكلمة الرئيسية المختلطة لقفل كائن. على سبيل المثال:
الفئة العامة mystack {int idx = 0 ؛ char [] data = new char [6] ؛ push push push synchronised public (char c) {data [idx] = c ؛ idx ++ ؛} synchronized char pop () {idx- بالمعنى الدقيق للكلمة ، يتم قفل جميع الكتل المتزامنة من الكائن M. إذا كان هناك مؤشر ترابط آخر يحاول الوصول إلى M ، فعندئذ لا يمكن تنفيذ أساليب الدفع والبوب لكائن M. */m.pop () ؛ // كائن M مغلق. }}إن فتح قفل Java هو تمامًا مثل العديد من الأشخاص الذين يصطفون في طابور في مرحاض عام. قام أول شخص بحبس الباب من الداخل بعد الدخول ، لذلك كان على الآخرين الانتظار في الطابور. سيتم فتح الباب فقط (فتح) عندما يخرج الشخص الأول بعد النهاية. لقد كان دور الشخص الثاني للدخول ، وسيغلق الباب من الداخل مرة أخرى ، وسيستمر الآخرون في الانتظار في الطابور.
من السهل فهم استخدام نظرية المرحاض: عندما يدخل شخص ما إلى مرحاض ، سيتم قفل المرحاض ، لكنه لن يتسبب في قفل المرحاض الآخر ، لأن شخصًا واحدًا لا يمكنه القرفصاء في مرحاضين في نفس الوقت. بالنسبة إلى Java ، فهذا يعني: يتم استهداف الأقفال في Java بنفس الكائن ، وليس في الفصل. انظر المثال التالي:
mystatckm1 = newMyStack () ؛ mystatckm2 = newMyStatck () ؛ m1.pop () ؛ m2.pop () ؛
لن تؤثر أقفال كائنات M1 على أقفال M2 لأنها ليست نفس موضع المرحاض. وهذا يعني ، إذا كان هناك 3 مؤشرات ترابط T1 و T2 و T3 التشغيل M1 ، فيمكن هذه الخيوط الثلاثة فقط في الانتظار والانتظار على M1. على افتراض أن الخيوط 2 الأخرى T8 ، T9 التشغيل M2 ، ثم T8 ، T9 سوف تنتظر فقط على M2. T2 و T8 لا علاقة له بها. حتى إذا تم إصدار القفل على M2 ، فقد لا يزال يتعين على T1 و T2 و T3 الانتظار على M1. لا يوجد سبب ، إنه ليس نفس مقعد المرحاض.
لا يمكن لـ Java إضافة قفلتين إلى كتلة رمز في نفس الوقت. هذا يختلف عن آلية قفل قاعدة البيانات. يمكن لقاعدة البيانات إضافة عدة أقفال مختلفة إلى سجل في نفس الوقت.
4 عندما يجب أن أصدر القفل؟
بشكل عام ، يتم إصدار القفل بعد تنفيذ كتلة رمز التزامن (كتلة الرمز القفل) ، أو يمكن إصدار القفل في منتصف الطريق من خلال WAIT (). تشبه طريقة Wait () القرفصاء في المرحاض في منتصف الطريق وفجأة وجدت أن المجاري قد تم حظرها. اضطررت إلى الخروج والوقوف جانباً حتى يتمكن مصلح الصرف الصحي (خيط جاهز للتنفيذ) من الدخول وإزالة المرحاض. بعد إلغاء الحظر ، صرخ السيد: "لقد تم إصلاحه". الرفيق الذي خرج الآن اصطف الآن مرة أخرى بعد سماعه. انتبه ، يجب أن تنتظر حتى يخرج السيد. إذا لم يخرج السيد ، فلن يتمكن أحد من الدخول. وهذا يعني ، بعد الإخطار ، يمكن لخيوط أخرى إدخال المنطقة المحظورة والتحرك على الفور ، ولكن يمكن أن تدخل مؤشرات الترابط الأخرى بعد المساحة المحظورة حيث يتم تنفيذ رمز الإخطار وإطلاقه لإصدار القفل.
فيما يلي مثال الانتظار وإخطار الرمز:
Synchronased char pop () {char c ؛ بينما (buffer.size () == 0) {try {this.wait () ؛ // out من المرحاض} catch (interruptedException e) {// تجاهلها ...}} c = ((حرف) buffer.remove (buffer.size ()-1)). charvalue () ؛ return c ؛} push push void المزامنة العامة (char c) {this.notify () ؛ // إخطار تلك المواضيع Wait () لتتمكن من الانتظار مرة أخرى. ملاحظة: فقط أبلغهم بإعادة إعادة. حرف charobj = حرف جديد (c) ؛ buffer.addelement (charobj) ؛} // تنفيذ وإطلاق القفل. يمكن أن تأتي هذه الخيوط في قائمة الانتظار.تعمق.
بسبب عملية الانتظار () ، فإن الرفاق الذين خرجوا في منتصف الطريق لن يصطفوا حتى تلقوا إشارة الإخطار. كان يشاهد الأشخاص الذين يصطفون في الانتظار بجانبه (سيد إصلاح أنابيب المياه هو من بينهم أيضًا). لاحظ أن سيد إصلاح أنابيب المياه لا يمكن أن يذهب إلى الخط ، ويجب أن يصطف مثل أولئك الذين يذهبون إلى المرحاض. ليس ذلك بعد أن خرج شخص في منتصف الطريق ، يمكن أن يظهر سيد إصلاح أنابيب المياه فجأة ويذهب لإصلاحه على الفور. إنه يريد التنافس بشكل عادل مع الأشخاص الذين كانوا يصطفون في الأصل ، لأنه أيضًا موضوع عادي. إذا تم تصطف سيد إصلاح أنابيب المياه ، فسيجد الشخص الأمامي أنه تم حظره وينتظر ، ثم يخرج ويقف جانباً ، والانتظار ، والخروج ، والوقوف جانباً ، والذهاب فقط إلى السيد للدخول وتنفيذ الإخطار. وبهذه الطريقة ، بعد فترة من الوقت ، سيكون هناك مجموعة من الأشخاص الذين يقفون بجانب قائمة الانتظار ، في انتظار الإخطار.
وأخيرا ، ذهب السيد في وإخطار. ماذا بعد؟
1. يتم إخطار شخص الانتظار (الموضوع).
2. لماذا يتم إخطاره بدلا من شخص الانتظار آخر؟ يعتمد على JVM. لا يمكننا الاستباق
تحديد أي واحد سيتم إخطاره. بمعنى آخر ، قد لا يستيقظ أولئك الذين لديهم أولوية عالية
في أي وقت لا يستيقظ بالضرورة أولاً ، كل شيء لا يمكن التنبؤ به! (بالطبع ، إذا كنت تعرف JVM
إذا تم تنفيذها ، يمكنك التنبؤ به).
3. هو (الخيط الذي تم إخطاره) يحتاج إلى الانتظار مرة أخرى.
4. هل سيكون في المقام الأول في الخط؟ الجواب هو: لست متأكدا. هل سيكون آخر واحد؟ ليس بالضرورة.
ولكن إذا كانت أولوية الخيط مرتفعة نسبيًا ، فإن احتمال أن يتم تصنيفه أولاً مرتفع نسبيًا.
5. عندما حان دوره لإعادة إدخال مقعد المرحاض ، سيستمر في التنفيذ من مكان الانتظار () ، ولن يعيد التنفيذ.
لوضعها بطريقة مثيرة للاشمئزاز ، سيستمر في التراجع ، وليس للتجول مرة أخرى.
6. إذا كان السيد يخطر () ، فإن جميع الأشخاص الذين استسلموا في منتصف الطريق سوف يصطفون مرة أخرى. الأمر غير معروف.
يقول Javadoc أن theawakenedthreadswillnotbeabletoproctionuntiltheCurrentTherLinquishTheTheTheSoBject (لا يمكن تنفيذ الخيط المستيقظ قبل أن يطلق الخيط الحالي القفل).
هذا واضح لشرح استخدام نظرية مقعد المرحاض.
استخدام 5lock
استخدم الكلمة الرئيسية المتزامنة لقفل الموارد. الكلمة الرئيسية القفل هي أيضا على ما يرام. إنه جديد في JDK1.5. الاستخدام كما يلي:
الفئة probedbuffer {final lock lock = new reentrantlock () ؛ الحالة النهائية notfull = lock.newcondition () ؛ الشرط النهائي notempty = lock.newcondition () ؛ الكائن النهائي [] عناصر = كائن جديد [100] ؛ notfull.await () ؛ العناصر [putptr] = x ؛ if (++ putptr == items.length) putptr = 0 ؛ ++ count ؛ notempty.signal () ؛} أخيرًا {lock.unlock () ؛ (++ takeptr == items.length) takeptr = 0 ؛-count ؛ notful.signal () ؛ return x ؛} أخيرًا {lock.unlock () ؛}}}(ملاحظة: هذا مثال في Javadoc ، مثال على تنفيذ قائمة انتظار الحظر. يعني ما يسمى قائمة انتظار الحظر أنه إذا كانت قائمة الانتظار ممتلئة أو فارغة ، فسوف يتسبب ذلك في حظر الخيط والانتظار. يوفر ArrayBlocking in Java قائمة انتظار جاهزة جاهزة ، ولا تحتاج إلى كتابة أحدها بشكل محدد.)
سيتم قفل الكود بين lock.lock () و lock.unlock () للكائن. ما هو أفضل شيء في هذه الطريقة مقارنة بالمزامنة؟ باختصار ، يصنف موضوعات الانتظار. لوصفها باستخدام نظرية مقعد المرحاض ، قد يكون لأولئك الذين يخرجون في منتصف الطريق ويخرجون من مقعد المرحاض والانتظار أسباب مختلفة. بعضها بسبب حظر المرحاض ، والبعض الآخر لأن المرحاض خارج الماء. عند الإخطار ، يمكنك الصراخ: إذا انتظرت حظر المرحاض ، فسوف تعود في الطابور (على سبيل المثال ، تم حل مشكلة المرحاض المحظورة) ، أو الصراخ ، إذا انتظرت حظر المرحاض ، فسوف تعود في الخط (على سبيل المثال ، تم حل مشكلة المرحاض). هذا يسمح لمزيد من التحكم التفصيلي. على عكس الانتظار والإخطار في المزامنة ، سواء تم حظر المرحاض أو أن المرحاض ليس مائيًا ، يمكنك فقط الصراخ: لقد انتظرت هنا للتو في الانتظار! إذا جاء الأشخاص الموجودون في الطابور وينظرون ، فإنهم يجدون أن مشكلة المرحاض قد تم حلها للتو ، والمشكلة التي يتوقون إلى حلها (المرحاض ليس له ماء) لم يتم حلها بعد ، لذلك يتعين عليهم العودة والانتظار (الانتظار) ، والذهاب للسير في وقت مبدوم ، ضيع الوقت والموارد.
العلاقة المقابلة بين طريقة القفل والمزامنة:
LockawaitSignalSignalall
synchronizedwaitnotifyNotifyall
ملاحظة: لا تتصل بالانتظار ، إخطارًا ، إخطارًا في كتل مغلقة بواسطة القفل
6. استخدم خطوط الأنابيب للتواصل بين المواضيع
المبدأ بسيط. خيوطان ، أحدهما يشغل pipedInputStream والآخر يعمل PipedOutputStream. يتم تخزين البيانات التي كتبها PipedOutputStream في المخزن المؤقت أولاً. إذا كان المخزن المؤقت ممتلئًا ، ينتظر هذا الموضوع. PipedInputStream يقرأ البيانات في المخزن المؤقت. إذا لم يكن للمخزن المؤقت بيانات ، فإن هذا الموضوع ينتظر.
يمكن تحقيق نفس الوظيفة عن طريق حظر قوائم الانتظار في JDK1.5.
package io ؛ import java.io.*؛ pipedstreamtest {public static void main (string [] args) {pipedOutputStream ops = new PipedOutputStream () ؛ pipedInputStream (Ops) المستهلك (PIS) .run () ؛} catch (استثناء e) {E.PrintStackTrace () ؛}}} // منتجات فئة المنتجين ينفذون {pipedoutputstream ops) Run () {try {ops.write ("hell ، spell" .getbytes ()) ؛ ops.close () ؛} catch (استثناء e) {e.printstacktrace () ؛}}} // consumer consumer consumer consumer consumer runnable {pipedInptream piS ؛ piperinptream piS) {this. Run () {try {byte [] bu = new byte [100] ؛ int len = pis.read (bu) ؛ system.out.println (سلسلة جديدة (bu ، 0 ، len)) ؛ pis.close () ؛مثال 2: يصبح التغيير القليل على البرنامج أعلاه موضوعين.
package io ؛ import java.io.*؛ class pipedstreamtest {public static void main (string [] args) {pipedOutputStream ops = new PipedOutputStream () ؛ pipedInputStream pis = new PipedInputStream () ؛ try {ops.connect (pis) ؛ // pipeline portizer p = new producer (ops) موضوع (p) .start () ؛ المستهلك c = مستهلك جديد (PIS) ؛ مؤشر ترابط جديد (C) .start () ؛} catch (استثناء e) {E.PrintStackTrace () ؛}}}} // منتج فئة المنتجين ينفذون {pipedoutream ops ؛ pipedoutream ops) {this. Run () {try {for (؛؛) {ops.write ("hell ، spell" .getbytes ()) ؛ ops.close () ؛}}} bu = new byte [100] ؛ int len = pis.read (bu) ؛ system.out.println (سلسلة جديدة (bu ، 0 ، len)) ؛} pis.close () ؛} catch (استثناء e) {eprintstacktrace () ؛}}}مثال 3. هذا المثال أكثر ملاءمة للتطبيق
استيراد java.io.*؛ الفئة العامة pipedio {// بعد تشغيل البرنامج ، انسخ محتوى ملف sendFile إلى ملف receiverfile public static static void main (string args []) pos.connect (PIS) ؛ // بناء اثنين من المواضيع والبدء. مرسل جديد (POS ، "C: /Text2.txt"). start () ؛ جهاز استقبال جديد (PIS ، "C: /Text3 Sender (pipedoutputstream pos ، اسم ملف السلسلة) {this.pos = pos ؛ ملف = ملف جديد (اسم الملف) ؛} // طريقة تشغيل سلسلة المواضيع العامة run () {try {// قراءة محتوى الملف fileInputStream fs = newInputStream (ملف) ؛ pos.write (data) ؛} pos.close () ؛} catch (ioException e) {system.out.println ("خطأ المرسل" +e) ؛}}} //. ملف (filename) ؛} // يقوم مؤشر ترابط تشغيل public void run () {try {// كتابة ملفات الدفق fileOutputStream fs = new FileOtputStream (ملف) ؛ int data ؛ // اقرأ بينما ((data = pis.read ())! =-1) e) {system.out.println ("خطأ الاستقبال" +e) ؛}}}7 حظر قائمة الانتظار
يمكن أن تحل قائمة انتظار الحظر محل طريقة تدفق خطوط الأنابيب لتنفيذ وضع أنابيب المدخل/الصرف (المنتج/المستهلك). يوفر JDK1.5 العديد من قوائم انتظار الحظر الجاهزة. الآن دعونا نلقي نظرة على كود arrayblockingqueue على النحو التالي:
هنا قائمة انتظار الحظر
blockingqueue blockingq = جديد arrayblockingqueue 10 ؛
موضوع يأخذ من قائمة الانتظار
لـ (؛؛) {object o = blockingq.take () ؛ // قائمة الانتظار فارغة ، ثم انتظر (حظر)}يتم تخزين موضوع آخر في قائمة الانتظار
لـ (؛ ؛) {blockingq.put (كائن جديد ()) ؛ // إذا كانت قائمة الانتظار ممتلئة ، فانتظر (حظر)}يمكن ملاحظة أن طوابير الحظر أبسط من خطوط الأنابيب.
8 Use Executors ، Executor ، ExecutorService ، Threadpoolexecutor
يمكنك استخدام مهام إدارة مؤشرات الترابط. يمكنك أيضًا استخدام مجموعة من الفصول التي توفرها JDK1.5 لإدارة المهام بشكل أكثر ملاءمة. من هذه الفئات ، يمكننا تجربة طريقة تفكير موجهة نحو المهمة. هذه الفصول هي:
واجهة المنفذ. كيفية استخدام:
Executor Executor = anexecutor ؛ // إنشاء مثيل Executor. Executor.execute (new RunNableTask1 ()) ؛
النية: يركز المستخدمون فقط على تنفيذ المهام ، ولا داعي للقلق بشأن إنشاء المهام وتفاصيل التنفيذ ، وغيرها من القضايا التي يهتم بها منفذي الطرف الثالث. وهذا يعني ، فصل تنفيذ مكالمة المهمة وتنفيذ المهمة.
في الواقع ، هناك بالفعل تطبيقات ممتازة لهذه الواجهة في JDK1.5. كافٍ.
المنفذون هو فئة المصنع أو فئة الأدوات مثل المجموعات ، وتستخدم لإنشاء مثيلات من واجهات مختلفة.
وارثت واجهة ExecutorService من Executor.executor فقط يلقي المهمة في Executor () للتنفيذ ، ويتجاهل الباقي. ExecutorService مختلف ، وسوف يقوم بمزيد من أعمال التحكم. على سبيل المثال:
Class NetWorkservice {private Final Serversocket ServerSocket ؛ Private ExecutorService Pool ؛ Public Networkservice (int port ، int poolsize) يلقي IoException {serversocket = new serversite (traw ؛ Handler (serversocket.accept ()))) ؛}} catch (ioException ex) {pool.shutdown () ؛ // لا يتم تنفيذ أي مهام جديدة}}} معالج الفئة الأدوات {private final socket (socket)بعد تنفيذ ExecutorService (أي ، كائن البركة في الكود) ، لم يعد بإمكانه تنفيذ مهام جديدة ، ولكن ستستمر تنفيذ المهام القديمة ، ولن ينتظر أولئك الذين ينتظرون التنفيذ.
إرسال المهام والاتصال الأداء
إلقاء الفراغ الثابت العام (سلسلة args []) استثناء {executorService executor = evelivors.newsinglethreadexecutor () ؛ task callable = new callable () {public string call system.out.println (result) ؛ executor.shutdown () ؛}مثيل المنفذ الذي تم الحصول عليه من قبل Executors.NewsingleThreadExecutor () له الخصائص التالية:
تنفيذ المهمة بالتتابع. على سبيل المثال:
Executor.Submit (Task1) ؛ Executor.Submit (Task2) ؛
يجب أن تنتظر تنفيذ Task1 قبل تنفيذ Task2.
سيتم وضع Task1 و Task2 في قائمة انتظار ومعالجتها بواسطة موضوع عامل. وهذا هو: هناك رسائلان في المجموع (الخيط الرئيسي ، مؤشر ترابط العمال الذي يعالج المهام).
للحصول على فصول أخرى ، يرجى الرجوع إلى Javadoc
9 التحكم في العملية المتزامنة
الأمثلة الواردة في هذا القسم هي من البرنامج التعليمي لـ Wen Shao's Java Concurrency وقد يتم تغييره. تحية للسيد وين.
عداد دبوس باب العد التنازلي
ابدأ الموضوع وانتظر حتى ينتهي الموضوع. وهذا هو ، يتم تنفيذ الخيط الرئيسي الشائع وغيرها من خيوط الأطفال بعد نهاية الخيط الرئيسي.
يرمي الفراغ الثابت العام (سلسلة [] args) الاستثناء {// todo method method method tuto tuto count final int count = 10 ؛ Final CountDownLatch CompleteLatch = new CountDownLatch (COUNT) ؛ // تحديد عدد المزلاجات هو 10 لـ (int i = 0 ؛ i <count ؛ i ++) completeLatch.countdown () ؛ // قلل من باب واحد}} ؛ thread.start () ؛} completeLatch.await () ؛ // إذا لم يتم تقليل مزلاج الباب بعد ، فانتظر. }في JDK1.4 ، تتمثل الطريقة الشائعة في تعيين حالة مؤشر ترابط الطفل واكتشاف الحلقة الرئيسية. سهولة الاستخدام والكفاءة ليست جيدة.
ابدأ العديد من المواضيع وانتظر أن تبدأ الإخطارات
يبرز الفراغ الثابت العام (سلسلة [] args) الاستثناء {// todo method method method tuto tuto strup final countlatch startlatch = new CountDownLatch (1) ؛ تم تخفيضه بعد ، انتظر} catch (InterruptedException e) {} // do xxxx}} ؛ thread.start () ؛Cyclibarrier. فقط بعد أن تصل جميع المواضيع إلى خط البداية ، يمكنهم الاستمرار في الجري.
الطبقة العامة cyclibarriertest تنفذ Runnable {private cyclibarrier barrier ؛ public cyclibarriertest (حاجز cyclibarrier) {this.barrier = barrier ؛} public void run () {// do xxxx ؛ حاول {this.barrier.await () ؛ إذا لم تصل ، فاستمر في الانتظار. عندما يتم الوصول إلى كل شيء ، قم بتنفيذ محتويات جسم وظيفة تشغيل الحاجز} catch (استثناء e) {}}/** * param args */public static void main (string [] args) {// parameter 2 يعني أن كلا الموضوعين قد وصلوا إلى خط البداية قبل البدء في تنفيذ Cyclicbarrier Barrier ؛ {// do xxxx ؛}}) ؛ مؤشر ترابط T1 = مؤشر ترابط جديد (cyclibarriErtest (حاجز)) ؛ موضوع T2 = مؤشر ترابط جديد (cyclibarriErtest (حاجز)) ؛ t1.start () ؛ t2.start () ؛}}هذا يبسط الطريقة التقليدية لتنفيذ هذه الوظيفة باستخدام Counter + Wait/Assifyall.
10 قانون التزامن 3
قانون أمدال. بالنظر إلى مقياس المشكلة ، فإن جزء التوازي يمثل 12 ٪. ثم ، حتى لو تم تطبيق التوازي على أقصى الحدود ، لا يمكن تحسين أداء النظام إلا بمقدار 1/(1-0.12) = 1.136 مرة على الأكثر. وهذا هو: التوازي لها حد أعلى لتحسين أداء النظام.
قانون غوستافسون. يقول قانون غوستافسون إن قانون Amdahl لا يعتبر أنه يمكن استخدام المزيد من قوة الحوسبة مع زيادة عدد وحدات المعالجة المركزية. يتمثل الجوهر في تغيير حجم المشكلة بحيث يمكن موازاة 88 ٪ المتبقية من المعالجة التسلسلية في قانون Amdahl ، وبالتالي اختراق عتبة الأداء. في جوهرها ، إنه نوع من وقت التبادل الفضائي.
قانون صن ني. إنه ترقية أخرى للقانون الأولين. الفكرة الرئيسية هي أن سرعة الحوسبة تقتصر على سرعة التخزين بدلاً من وحدة المعالجة المركزية. لذلك ، يجب أن نستفيد بالكامل من موارد الحوسبة مثل مساحة التخزين ومحاولة زيادة حجم المشكلة لإنتاج حلول أفضل/أكثر دقة.
11 من المتزامن إلى التوازي
تحتاج أجهزة الكمبيوتر إلى حساب بسرعة عند تحديد الكائنات ، بحيث تصبح الرقائق ساخنة وساخنة. عندما يتعرف الناس على الأشياء ، يكونون واضحين في لمحة ، لكنهم لا يتسببون في حرق خلية دماغية معينة (مبالغ فيها) ويشعرون بعدم الارتياح. وذلك لأن الدماغ هو نظام تشغيل مواز موزع. تمامًا مثل Google ، يمكن أن تستخدم بعض خوادم Linux الرخيصة لإجراء حسابات ضخمة ومعقدة ، وعدد لا يحصى من الخلايا العصبية في الدماغ يحسب بشكل مستقل ، ومشاركة النتائج مع بعضها البعض ، وإكمال التأثير الذي يتطلب على الفور تريليونات العمليات لوحدة المعالجة المركزية واحدة. فقط تخيل ، إذا تم إنشاؤه في مجال المعالجة المتوازية ، فسيكون لها تأثير لا يقاس على تطور وأجهزة الكمبيوتر. بالطبع ، يمكن أيضًا تخيل التحديات: العديد من المشكلات ليست "مقسمة" بسهولة.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول مشكلة تزامن Java ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!