জাভা সিঙ্ক্রোনাইজড স্ট্যাটিক পদ্ধতি: অবজেক্ট বা ক্লাসে লক করুন


148

জাভা ডকুমেন্টেশন বলে:

একই বস্তুতে ইন্টারলিওয়েতে দুটি সিঙ্ক্রোনাইজড মেথডের জন্য অনুরোধ করা সম্ভব নয়।

স্থির পদ্ধতিতে এর অর্থ কী? যেহেতু একটি স্থিতিশীল পদ্ধতির কোনও সম্পর্কিত অবজেক্ট নেই, তাই কি বস্তুর পরিবর্তে ক্লাসে সিঙ্ক্রোনাইজ করা কীওয়ার্ডটি লক হবে?

উত্তর:


129

যেহেতু একটি স্থিতিশীল পদ্ধতির কোনও সম্পর্কিত অবজেক্ট নেই, তাই কি বস্তুর পরিবর্তে ক্লাসে সিঙ্ক্রোনাইজ করা কীওয়ার্ডটি লক হবে?

হ্যাঁ. :)


81
দয়া করে প্রশস্ত উত্তর দিন যাতে প্রত্যেকে বুঝতে পারে।
মধু

6
@Madhu। এর অর্থ হ'ল যদি আপনার একই ক্লাসে 2 বা ততোধিক সিঙ্ক্রোনাইজড পদ্ধতি থাকে তবে উভয়ই একই সময়ে কার্যকর করতে পারে না, এমনকি যখন class শ্রেণীর একাধিক উদাহরণ রয়েছে। লকিং মূলত প্রতিটি সিঙ্ক্রোনাইজড পদ্ধতির জন্য অবজেক্ট.ক্লাসে লক করা সমান।
স্টিভেন

এই উত্তরটি ভুল - thisউদাহরণস্বরূপ পদ্ধতিগুলিতে লকটি কী অর্জিত হয়েছে- দয়া করে এটি অস্কারকে ঠিক করুন।
vemv

1
@vemv প্রশ্নটি ক্লাসের পদ্ধতি সম্পর্কিত, উদাহরণ পদ্ধতি নয়।
অস্কাররাজ

23
@ ওয়েমভ আচ্ছা হ্যাঁ, উত্তরটি বুঝতে আপনাকে প্রথমে প্রশ্নটি পড়তে হবে।
অস্কার রাইজ

199

অস্কারের (আনন্দদায়ক সংযোগ ) উত্তরটিতে কেবল কিছুটা যুক্ত করতে জাভা ভাষা নির্দিষ্টকরণের প্রাসঙ্গিক বিভাগটি 8.4.3.6, 'সিঙ্ক্রোনাইজড মেথডস' :

একটি সিঙ্ক্রোনাইজড পদ্ধতি কার্যকর করার আগে একটি মনিটর ( §17.1 ) অর্জন করে। কোনও শ্রেণি (স্থির) পদ্ধতির জন্য, পদ্ধতির শ্রেণীর জন্য শ্রেণীর অবজেক্টের সাথে সম্পর্কিত মনিটর ব্যবহার করা হয়। উদাহরণস্বরূপ পদ্ধতির জন্য, এর সাথে যুক্ত মনিটরটি (যে পদার্থটির জন্য পদ্ধতিটি আহ্বান করা হয়েছিল) ব্যবহৃত হয়।


17
দরকারী, আমি সেই উদ্ধৃতিটি
খুঁজছিলাম

80

একটি বিষয় সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে (বেশ কয়েকটি প্রোগ্রামার সাধারণত সেই ফাঁদে পড়ে) হ'ল সিঙ্ক্রোনাইজড স্ট্যাটিক পদ্ধতি এবং সিঙ্কড অ স্ট্যাটিক পদ্ধতির মধ্যে কোনও লিঙ্ক নেই, অর্থাত:

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

প্রধান:

A a = new A();

থ্রেড 1:

A.f();

থ্রেড 2:

a.g();

f () এবং g () একে অপরের সাথে সিঙ্ক্রোনাইজ হয় না এবং এভাবে সম্পূর্ণ একযোগে সম্পাদন করতে পারে।


18
তবে জি () যদি কিছু স্ট্যাটিক ভেরিয়েবল পরিবর্তন করে যা চ (চ) পড়ছে what আমরা কীভাবে সেই থ্রেডটিকে নিরাপদ করব? আমরা কি তখন ক্লাসে স্পষ্টভাবে একটি লক অর্জন করি?
বাসকিন

22
হ্যাঁ, আপনার অ স্ট্যাটিক পদ্ধতি স্পষ্টভাবে বর্গ নিজেই (অর্থাত, উপর সুসংগত করা আবশ্যক synchronized (MyClass.class) {...}
jfpoilpret

@jfpoil ব্যাখ্যা "সিঙ্ক্রোনাইজড (MyClass.class) {...}" এই পদ্ধতিটি স্থির সিঙ্ক্রোনাইজ করা সমান, তাই না?
পাগলমাইন্ড

15

আপনি নীচে g () প্রয়োগ না করলে:

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

আমি এই প্যাটার্নটিকেও দরকারী মনে করি যখন আমি বস্তুর বিভিন্ন উদাহরণগুলির মধ্যে পারস্পরিক বর্জন প্রয়োগ করতে চাই (যেমন বাহ্যিক সংস্থান অ্যাক্সেস করার সময় প্রয়োজন হয়, উদাহরণস্বরূপ)।


63
মনে রাখবেন যে এখানে কিছু খুব সূক্ষ্ম এবং বাজে বাগের সম্ভাবনা থাকতে পারে। রানটাইম টাইপের getClass()রিটার্ন মনে রাখবেন ; আপনি যদি ক্লাসটি সাবক্লাস করেন তবে পিতামাত্ত শ্রেণি এবং শিশু শ্রেণি বিভিন্ন লকে সিঙ্ক্রোনাইজ হবে। আপনার যদি সমস্ত দৃষ্টান্তগুলি একই লকটি ব্যবহার করে তা নিশ্চিত করার প্রয়োজন হয় তবে যাওয়ার উপায়। synchronized(MyClass.class)
কাউয়ান

4

ইন্ট্রিনসিক লক্স এবং সিঙ্ক্রোনাইজেশনে ওরাকল ডকুমেন্টেশন পৃষ্ঠাটি দেখুন

আপনি যদি ভাবতে পারেন যে স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতি চালু করা হয় তখন কী ঘটে থাকে, যেহেতু স্থির পদ্ধতি কোনও শ্রেণীর সাথে সম্পর্কিত হয়, কোনও বস্তুর সাথে নয়। এই ক্ষেত্রে, থ্রেড শ্রেণীর সাথে সম্পর্কিত ক্লাস অবজেক্টের জন্য অভ্যন্তরীণ লকটি অর্জন করেসুতরাং শ্রেণীর স্থির ক্ষেত্রগুলিতে অ্যাক্সেসটি এমন কোনও লক দ্বারা নিয়ন্ত্রিত হয় যা শ্রেণীর কোনও উদাহরণের জন্য লক থেকে আলাদা


2

একটি স্থিতিশীল পদ্ধতিতেও একটি সম্পর্কিত অবজেক্ট থাকে। এটি জেডিকে টুলকিট-এর Class.class ফাইলের অন্তর্গত। যখন ক্লাস ফাইলটি রামটিতে লোড হয়, তখন ক্লাস.ক্লাস এটির একটি উদাহরণ তৈরি করে যার নাম টেমপ্লেট অবজেক্ট।

উদাহরণস্বরূপ: - যখন আপনি বিদ্যমান গ্রাহক শ্রেণীর মতো বস্তু তৈরি করার চেষ্টা করবেন

Customer c = new Customer();

গ্রাহক.ক্লাসটি রামে লোড করুন। এই মুহুর্তে জেডিকে টুলকিটের ক্লাস.ক্লাস টেম্পলেট অবজেক্ট নামে একটি অবজেক্ট তৈরি করে এবং গ্রাহক.ক্লাসকে সেই টেম্পলেট অবজেক্টে লোড করুন that গ্রাহক.ক্লাসের স্ট্যাটিক সদস্যরা সেই টেমপ্লেট অবজেক্টে বৈশিষ্ট্য এবং পদ্ধতিতে পরিণত হয়।

সুতরাং একটি স্থিতিশীল পদ্ধতি বা বৈশিষ্ট্যেরও একটি অবজেক্ট থাকে


2

উদাহরণগুলির নীচে ক্লাস এবং অবজেক্ট লকটির মধ্যে আরও স্পষ্টতা দেওয়া হয়েছে, আশা করি নীচের উদাহরণটি অন্যকেও সহায়তা করবে :)

উদাহরণস্বরূপ, আমাদের নীচের পদ্ধতিগুলির মধ্যে একটি রয়েছে ক্লাস অর্জন এবং অন্যটি অবজেক্ট লক অর্জন:

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

0

যাঁরা পরিচিত স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতিটি ক্লাস অবজেক্টে লক করে রাখেন যেমন স্ট্রিং ক্লাসের জন্য তার স্ট্রিংক্লাস যখন জাভাতে "এই" কীওয়ার্ড দ্বারা চিহ্নিত অবজেক্টের বর্তমান উদাহরণে সিঙ্ক্রোনাইজড মেথড লক হয়। যেহেতু এই উভয় বস্তু পৃথক পৃথক লক রয়েছে তাই যখন একটি থ্রেড স্থিতিশীল সিঙ্ক্রোনাইজড পদ্ধতিটি চালাচ্ছে তখন জাভাতে অন্যান্য থ্রেডের জন্য সেই থ্রেডটি ফিরে আসার অপেক্ষা রাখে না এটি পরিবর্তে এটি পৃথক লক চিহ্নিত করা বাইট .ক্লাস আক্ষরিক অর্জিত হয় এবং প্রবেশ করায় স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.