في Java ماذا يحدث إذا استدعى فئتان طريقة في فئة ثالثة في نفس اللحظة؟

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

سؤال

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

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

المحلول

يبدو أنك بحاجة إلى التفكير في الترابط والمزامنة.أوصي بقراءة "التزامن في تطبيق Java".

نصائح أخرى

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

إليك مثال للبدء:

public class Test {

    public static void main(String[] args) throws Exception {
        new Thread() { public void run() { Test.method(); }}.start();
        new Thread() { public void run() { Test.method(); }}.start();
    }

    public synchronized static void method() {
        System.out.println("hello ");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {}
        System.out.println("world");
    }
}

بدون ال synchronized المعدل، فإن هذا البرنامج قد طبع

hello 
hello    
world
world

مع ال synchronized الكلمة الأساسية، يمكن استدعاء موضوع واحد فقط في كل مرة method, ، وبالتالي يطبع البرنامج

hello 
world
hello 
world

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

الإجابة الصحيحة من الناحية النظرية هي: "يمكن أن يحدث أي شيء".

يمكن تشغيل المكالمتين واحدة تلو الأخرى أو متداخلة مع بعضهما البعض ، والنتائج غير متوقعة ومن المحتمل أن تكون كارثية.

لهذا السبب تقدم لك Java عدة طرق للتعامل معها.

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

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

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