سؤال

تقول برامج Java التعليمية:"ليس من الممكن أن يتداخل استدعاءان للطرق المتزامنة على نفس الكائن."

ماذا يعني هذا بالنسبة للطريقة الثابتة؟نظرًا لأن الطريقة الثابتة لا تحتوي على كائن مرتبط، فهل سيتم قفل الكلمة الأساسية المتزامنة على الفصل بدلاً من الكائن؟

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

المحلول

<اقتباس فقرة>   

ومنذ أسلوب ثابت لا يوجد كائن المرتبطة بها، <م> سوف قفل الكلمة متزامنة على الطبقة، بدلا من الكائن؟

نعم. :)

نصائح أخرى

وفقط لإضافة القليل من التفاصيل ل(موجزة سارة!) الجواب أوسكار، القسم المختص في اللغة مواصفات جاوة هو <وأ href = "http://docs.oracle.com/javase/specs/jls/se7/ أتش تي أم أل / JLS-8.html # JLS-8.4.3.6 "يختلط =" noreferrer "> 8.4.3.6،" طرق متزامنة ":

<اقتباس فقرة>   

وهناك طريقة متزامنة يكتسب رصد (§17.1) قبل أن ينفذ. لأسلوب فئة (ثابت)، يتم استخدام جهاز العرض مع كائن Class للفئة طريقة ل. لأسلوب مثيل، ويستخدم جهاز العرض المرتبطة هذا (الكائن الذي تم استدعاء الأسلوب).

ونقطة واحدة عليك أن تكون حذرا حول (سقوط العديد من المبرمجين عموما في هذا الفخ) هو أنه لا يوجد أي ارتباط بين أساليب ثابتة متزامنة والأساليب غير ثابتة sync'ed، أي:

class A {
    static synchronized f() {...}
    synchronized g() {...}
}

الرئيسية:

A a = new A();

والموضوع 1:

A.f();

والموضوع 2:

a.g();

و () و (ز) () غير متزامنة مع بعضها البعض، وبالتالي يمكن تنفيذ نفس الوقت تماما.

وإلا إذا كنت تنفيذ ز () كما يلي:

g() {
    synchronized(getClass()) {
        ...
    }
}

وأجد أن هذا النمط من المفيد أيضا عندما أريد أن تنفيذ الاستبعاد المتبادل بين حالات مختلفة من الجسم (الذي هو ضروري عندما accesing مورد خارجي، على سبيل المثال).

قم بإلقاء نظرة على صفحة وثائق أوراكل على الأقفال الجوهرية والتزامن

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

ولديه أسلوب ثابت أيضا كائن المرتبطة بها. انه ينتمي الى Class.class الملف في JDK الأدوات. عند تحميل ملف. الطبقة في ذاكرة الوصول العشوائي، يخلق Class.class مثيل لها يسمى الكائن القالب.

وعلى سبيل المثال: - عند محاولة إنشاء كائن من الدرجة العملاء الحاليين مثل

Customer c = new Customer();

والحمل Customer.class إلى RAM. في تلك اللحظة Class.class في JDK أدوات يخلق كائن يسمى الكائن القالب وتحميل أن Customer.class إلى ذلك القالب أعضاء object.Static من أن تصبح Customer.class الصفات والأساليب في هذا الكائن القالب.

وهكذا أسلوب ثابت أو سمة لديها أيضا كائن

توضح الأمثلة أدناه المزيد من الوضوح بين قفل الفئة وقفل الكائن، ونأمل أن يساعد المثال أدناه الآخرين أيضًا :)

على سبيل المثال، لدينا أدناه طرق للحصول على فئة وأخرى للحصول على قفل الكائن:

public class MultiThread {

    public static synchronized void staticLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public synchronized void objLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

إذن، الآن يمكن أن يكون لدينا السيناريوهات التالية:

  1. عند استخدام المواضيع نفس الكائن يحاول الوصول objLock أو staticLock الطريقة في نفس الوقت (أيكلا الموضوعين يحاولان الوصول إلى نفس الطريقة)

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  2. عند استخدام المواضيع نفس الكائن يحاول الوصول staticLock و objLock الأساليب في نفس الوقت (يحاول الوصول إلى طرق مختلفة)

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    
  3. عند استخدام المواضيع كائن مختلف يحاول الوصول staticLock طريقة

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  4. عند استخدام المواضيع كائن مختلف يحاول الوصول objLock طريقة

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    

وبالنسبة لأولئك الذين ليسوا على دراية ثابت طريقة متزامنة مغلق على فئة الكائن على سبيل المثال لفئة سلسلة String.class في حين المثال متزامنة أقفال الطريقة على سبيل المثال الحالي للكائن الرمز بواسطة "هذه" الكلمة الرئيسية في جاوة. ونظرا لأن كلا من هذه وجوه مختلفة لديهم تأمين مختلفة وذلك في حين مؤشر واحد يتم تنفيذ طريقة تزامن ثابت، لا يحتاج موضوع آخر في جافا لانتظار أن موضوع للعودة بدلا من ذلك سوف اكتساب قفل منفصلة تدل بايت. الطبقة الحرفي والدخول في طريقة تزامن ثابت.

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