هل يجب علي مزامنة الوصول إلى هياكل البيانات الآمنة المغلقة في جافا؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

قل لدي شيء مثل هذا (وأفعل)

class QueBean extends JPanel {
    private Queue queue = new LinkedBlockingQueue();

    public Object poll(){
        return queue.poll();
    }
}

مع بعض هذه التي تعمل على المواضيع الخاصة بهم

class ConsumerBean extends JPanel implements Runnable{
    private QueBean queBean;

    public synchronized run(){
        while (true) {
           Object result =  queBean.poll();
           if (result != null) {
              jResultTextField.setText("got one");  
           }
           wait(500);
        }
    }
}

يجب أن بلدي poll() في ال QueBean يكون synchronized أم لا؟

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

المحلول

المزامنة الخارجية ليست ضرورية في هذه الحالة. إقرأ ال BlockingQueue عقد:

تطبيقات BlockingQueue آمنة للخيط. يحقق جميع طرق قائمة الانتظار تأثيراتها بشكل ساحلي باستخدام الأقفال الداخلية أو أشكال أخرى من التحكم في التزامن.

نصائح أخرى

هناك مشكلة خيوط، ولكن ليس الشخص الذي تعتقد أنه - الرمز الذي نشرته هو بالتأكيد غير قانوني تقريبا وسوف يحبس في النهاية.

أحد القواعد الأساسية الأساسية هو أنه يسمح فقط مؤشر ترابط واحد بالمس مكونات "أدركت". (أحدث الوسائل على الشاشة أو "تقريبا" على الشاشة).

هذه:

jResultTextField.setText("got one"); 

من المؤكد أنه من المؤكد أن يخطئ الخيط - أنت فقط لا تستطيع أن تفعل ذلك. تحقق من InvokeLater أو InvokeAndwait لتحقيق تحديثات الشاشة على موضوع AWT الخاص بك.

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

لا، ليست هناك حاجة. منذ حسابك poll الطريقة لا شيء ما عدا استدعاء طريقة آمنة للخيط، لا يوجد إمكانية لفساد البيانات.

لا تحتاج إلى القيام بذلك، طالما queue لا يتغير في QueBean.

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

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