سؤال

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

private Service service;

public void initialise() {
    // load external service
    // set field to the loaded service if contacted
    // set to field to null if service could not be contacted
}

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

public String get() {
    if (service == null) {
        // try and load the service again
    }
    // perform operation on the service is service is not null
}

هل من الممكن أن أكون قد لديك مشاكل المزامنة إذا كنت سوف تفعل شيئا مثل هذا؟

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

المحلول

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

private Service service;

public synchronized void initialise() {
    if (service == null) {
        // load external service
        // set field to the loaded service if contacted
    }
}

public String get() {
    if (service == null) {            
        initialise(); // try and load the service again
    }
    // perform operation on the service is service is not null
}

نصائح أخرى

نعم، سيكون لديك مشكلة المزامنة.

لنفترض لديك بريمج واحد:

public class FooServlet extends HttpServlet {

    private MyBean myBean;

    public void init() {
        myBean = (MyBean) WebApplicationContextUtils.
            getRequiredWebApplicationContext(getServletContext()).getBean("myBean");
    }

    public void doGet(HttpRequest request, HttpResponse response) {
        String string = myBean.get();
        ....
    }

}

class MyBean {
    public String get() {
        if (service == null) {
            // try and load the service again
        }
        // perform operation on the service is service is not null
    }
}

وتعريف الفول الخاص بك يبدو مثل:

<bean id="myBean" class="com.foo.MyBean" init-method="initialise" />

والمشكلة هي أن يستخدم المثال بريمج من خلال عدة مؤشرات ترابط الطلب. وبالتالي، فإن كتلة التعليمات البرمجية يحرسها خدمة == يمكن إدخال لاغية من المواضيع متعددة.

وأفضل الإصلاح (تجنب انقر نقرا مزدوجا قفل إيداعه الخ) هي:

class MyBean {
    public synchronized String get() {
        if (service == null) {
            // try and load the service again
        }
        // perform operation on the service is service is not null
    }
}

ونأمل أن يكون هذا الأمر يبدو معقولا تماما. إسقاط تعليق إن لم يكن.

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