نصائح لترميز برامج جافا في سيناريو متعدد النواة [مغلق]

StackOverflow https://stackoverflow.com/questions/601491

سؤال

يبدو أن هناك الكثير من الضجة حول multicore وjava.بينما يقول بعض الناس أن دعم جافا ليس كذلك جيد بما فيه الكفاية, ، يبدو بالتأكيد أنه مجال نتطلع إليه.يبدو انه هناك كثير التقنيات لتحسين أداء البرامج المتزامنة.

نقدر أي نصائح/نصائح حول البرمجة في سيناريو متعدد النواة.

هل كانت مفيدة؟

المحلول

والنظر في التسهيلات جافا التزامن جديدة (في حزمة java.util.concurrent ) التي تمت إضافتها في جاوة 5. ويوفر وظائف التي هي أكثر رفيع المستوى من Threads العادية والتي سوف تجعل من السهل (وأقل عرضة للخطأ) لكتابة التطبيقات المتزامنة. الدرس : التزامن من <لأ href = "HTTP: // java.sun.com/docs/books/tutorial/index.html "يختلط =" noreferrer "> ودروس جافا سيكون مكانا جيدا للبدء.

وحتى الآن، لقد استعملت فقط في ExecutorService ، والذي يسمح يمكن أن تنتج حمامات موضوع ، التي مهام جديدة يمكن أن يتم تسليم قبالة بوحدات <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runnable.html" يختلط = "noreferrer"> Runnable الصورة أو <وأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Callable.html" يختلط = " noreferrer "> Callable (التي يمكن إرجاع القيم بعد تنفيذ ك <لأ href =" http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future. يتم التعامل مع أتش تي أم أل "يختلط =" noreferrer "> Future ق)، ورمز خيوط الفعلي من قبل ExecutorService.

وعلى سبيل المثال، وأداء بعض الحسابات باستخدام ترابط التجمع من 2 المواضيع، والحصول على النتيجة يمكن أن تكون بسيطة مثل:

ExecutorService es = Executors.newFixedThreadPool(2);

Future f1 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Future f2 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Integer firstInteger = f1.get();
Integer secondInteger = f2.get();

في رمز أعلاه (مجربة)، كل ما لدي ما يدعو للقلق هو جعل بضعة Callables و <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java /util/concurrent/ExecutorService.html#submit(java.util.concurrent.Callable) "يختلط =" noreferrer "> submit جي هو إلى ExecutorService وفي وقت لاحق، وذلك باستخدام Futures لاسترداد النتيجة.

والصيد هو، مرة واحدة في get طريقة من Future، إذا كانت المعالجة ليست كاملة، سوف يتوقف البرنامج حتى يمكن استرداد نتيجة Future. لذلك، في هذا المثال، حتى إذا كانت نتيجة f2 متاح قبل f1، البرنامج سوف تنتظر حتى نتيجة f1 متاح.

في مجال مواد للقراءة، على قائمتي من الكتب لشراء قريبا هو href="http://jcip.net/" جافا التزامن في الممارسة بريان غوتز، والتي تأتي في كثير من الأحيان عندما يتم إحضارها التزامن في جاوة تصل.

الصفحة التزامن المرافق من وثائق جافا 5 لديه المزيد من المعلومات كذلك.

نصائح أخرى

أفضل نصيحة يجب أن تكون: احصل على المزامنة الصحيحة!

قد يبدو هذا واضحا إلى حد ما ولكن فهم نموذج ذاكرة جافا أمر حيوي، وخاصة كيف متقلب و أخير الحقول تعمل، كيف متزامن بمثابة كائن المزامنة (mutex). و أ حاجز الذاكرة ومن ثم الجديد java.util.concurrent يبني كذلك

ودائما نصيحة جيدة - إذا كان معظم الفصول الدراسية هي غير قابلة للتغيير كل شيء يصبح أسهل بكثير كما ثبات يزيل الحاجة للقلق بشأن أقفال من العديد من الأماكن القليلة التي تهم

.

وتحقق من إطار شوكة الانضمام . الشوكة-انضمام إطار يتيح للمطورين لتحقيق التوازي غرامة الحبيبات على أبنية متعددة النواة.

وكما قد ترغب في التحقق من JVM اللغات القائمة على مثل كلوجر التي تدعي لجعل البرمجة المتوازية والمتعددة أسهل.

وكبديل لنهج الذاكرة المشتركة الخاصة جاوة إلى التزامن هل يمكن أن ننظر أيضا إلى القائم على الممثل التزامن باستخدام سكالا على رأس جافا، والتي توفر نموذجا أسهل للبرمجة المتزامنة.

تحقق من حديث براين جويتز <لأ href = "http://wiki.parleys.com/display/PARLEYS/Home#talk=24576007؛title=From٪20Concurrent٪20to٪20Parallel؛slide=1" يختلط = " نوفولو noreferrer "> من بالتزامن موازية من Devoxx 2008. ليس هناك الكثير من النصائح هناك، لكنه يعطيك فكرة حيث جافا التوافق يتجه ل.

يمكنك محاولة استخدام مكتبة أنماط التوازي مثل سكانديوم لجافا.ما عليك سوى اختيار نمط التوازي الذي تريده وملء الخطافات المفقودة.

بعض الأنماط المدعومة في سكانديوم هي:

  • السيد والعبد: Farm<P,R>(nested);
  • خط انابيب:`الأنبوب (المرحلة 1، المرحلة 2)؛
  • للتكرار: For<P,R>(nested, i);
  • التكرار الشرطي: While<P,R>(nested, condition);
  • التفرع المشروط: If<P,R>(condition, trueCase, falseCase);
  • تقليل الخريطة: Map<P,R>(split, nested, merge);
  • تقليل الخريطة بمسارات تعليمات برمجية مختلفة: Fork<P,R>(split, nested, merge);
  • فرق تسد العودي: DaC<P,R>(condition, split, nested, merge);

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

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

ونصيحة لي: فهم الذاكرة نموذج جافا (منذ JDK 5 و أعلى). معظم الناس لا يعرفون، أن التزامن، متقلبة، والنهائي لها معنى إضافي خارج متعددة خيوط نطاق العادي.

وجافا على ما يرام لتعدد وحدة المعالجة المركزية والنوى المتعددة. إذا كنت برمجة ذلك الحق، وأن تستثمر بعض الدماغ، وتحصل على نظام الخادم المتزامنة للغاية للاستفادة من 8 النوى بما في ذلك الكثير من تزامن وهلم جرا. ونحن سعداء جدا معها ... JDK6 أفضل من JDK5 وكل شيء تحت تمتص على آلات متعددة وحدة المعالجة المركزية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top