سؤال

هل هناك طريقة في جاوة للحصول على طريقة لقفل (مزامنة) الكائن الذي هو في؟

وأعرف أن هذا يبدو مربكا ولكن في الأساس أنا wan't لاكويفيلينت في هذا المقتطف من C # ولكن في جاوة.

lock(this)
{
    // Some code here...
}

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

وعلى أي حال يبدو السطر أعلاه في C # نسخة وأنا بحاجة إلى شيء أن يفعل نفس الشيء في جافا.

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

المحلول

وما يعادل ذلك هو:

synchronized (this)
{
}

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

نصائح أخرى

وعلى افتراض أن الرمز C ++ هو كائن مزامنة بسيطة، يستعاض عن عبارة "تأمين" مع "متزامنة"

synchronized (this)
{
// ...
}

وهنا يكمن جافا التزامن تعليمي للحصول على مزيد من المعلومات

وأود أن أوصى بريان جويتز " جافا التزامن في الممارسة ". هذا كتاب ممتاز.

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

ومثل هذا:

public class PrivateLock {
    private final Object myLock = new Object();
    @GuardedBy("myLock") Widget widget;

    void someMethod() {
        synchronized (myLock) {
            // Access or modify the state of widget
        }
    }
}

ويجب أن ننظر أيضا في حزمة java.util.concurrent من API (JDK 5.0+) لإدارة التزامن إضافية كائنات مثل إشارة، المبادلات، الخ

HTTP: / /java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html

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