উত্তর:
যেহেতু একটি স্থিতিশীল পদ্ধতির কোনও সম্পর্কিত অবজেক্ট নেই, তাই কি বস্তুর পরিবর্তে ক্লাসে সিঙ্ক্রোনাইজ করা কীওয়ার্ডটি লক হবে?
হ্যাঁ. :)
this
উদাহরণস্বরূপ পদ্ধতিগুলিতে লকটি কী অর্জিত হয়েছে- দয়া করে এটি অস্কারকে ঠিক করুন।
অস্কারের (আনন্দদায়ক সংযোগ ) উত্তরটিতে কেবল কিছুটা যুক্ত করতে জাভা ভাষা নির্দিষ্টকরণের প্রাসঙ্গিক বিভাগটি 8.4.3.6, 'সিঙ্ক্রোনাইজড মেথডস' :
একটি সিঙ্ক্রোনাইজড পদ্ধতি কার্যকর করার আগে একটি মনিটর ( §17.1 ) অর্জন করে। কোনও শ্রেণি (স্থির) পদ্ধতির জন্য, পদ্ধতির শ্রেণীর জন্য শ্রেণীর অবজেক্টের সাথে সম্পর্কিত মনিটর ব্যবহার করা হয়। উদাহরণস্বরূপ পদ্ধতির জন্য, এর সাথে যুক্ত মনিটরটি (যে পদার্থটির জন্য পদ্ধতিটি আহ্বান করা হয়েছিল) ব্যবহৃত হয়।
একটি বিষয় সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে (বেশ কয়েকটি প্রোগ্রামার সাধারণত সেই ফাঁদে পড়ে) হ'ল সিঙ্ক্রোনাইজড স্ট্যাটিক পদ্ধতি এবং সিঙ্কড অ স্ট্যাটিক পদ্ধতির মধ্যে কোনও লিঙ্ক নেই, অর্থাত:
class A {
static synchronized f() {...}
synchronized g() {...}
}
প্রধান:
A a = new A();
থ্রেড 1:
A.f();
থ্রেড 2:
a.g();
f () এবং g () একে অপরের সাথে সিঙ্ক্রোনাইজ হয় না এবং এভাবে সম্পূর্ণ একযোগে সম্পাদন করতে পারে।
synchronized (MyClass.class) {...}
।
আপনি নীচে g () প্রয়োগ না করলে:
g() {
synchronized(getClass()) {
...
}
}
আমি এই প্যাটার্নটিকেও দরকারী মনে করি যখন আমি বস্তুর বিভিন্ন উদাহরণগুলির মধ্যে পারস্পরিক বর্জন প্রয়োগ করতে চাই (যেমন বাহ্যিক সংস্থান অ্যাক্সেস করার সময় প্রয়োজন হয়, উদাহরণস্বরূপ)।
getClass()
রিটার্ন মনে রাখবেন ; আপনি যদি ক্লাসটি সাবক্লাস করেন তবে পিতামাত্ত শ্রেণি এবং শিশু শ্রেণি বিভিন্ন লকে সিঙ্ক্রোনাইজ হবে। আপনার যদি সমস্ত দৃষ্টান্তগুলি একই লকটি ব্যবহার করে তা নিশ্চিত করার প্রয়োজন হয় তবে যাওয়ার উপায়। synchronized(MyClass.class)
ইন্ট্রিনসিক লক্স এবং সিঙ্ক্রোনাইজেশনে ওরাকল ডকুমেন্টেশন পৃষ্ঠাটি দেখুন
আপনি যদি ভাবতে পারেন যে স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতি চালু করা হয় তখন কী ঘটে থাকে, যেহেতু স্থির পদ্ধতি কোনও শ্রেণীর সাথে সম্পর্কিত হয়, কোনও বস্তুর সাথে নয়। এই ক্ষেত্রে, থ্রেড শ্রেণীর সাথে সম্পর্কিত ক্লাস অবজেক্টের জন্য অভ্যন্তরীণ লকটি অর্জন করে । সুতরাং শ্রেণীর স্থির ক্ষেত্রগুলিতে অ্যাক্সেসটি এমন কোনও লক দ্বারা নিয়ন্ত্রিত হয় যা শ্রেণীর কোনও উদাহরণের জন্য লক থেকে আলাদা ।
একটি স্থিতিশীল পদ্ধতিতেও একটি সম্পর্কিত অবজেক্ট থাকে। এটি জেডিকে টুলকিট-এর Class.class ফাইলের অন্তর্গত। যখন ক্লাস ফাইলটি রামটিতে লোড হয়, তখন ক্লাস.ক্লাস এটির একটি উদাহরণ তৈরি করে যার নাম টেমপ্লেট অবজেক্ট।
উদাহরণস্বরূপ: - যখন আপনি বিদ্যমান গ্রাহক শ্রেণীর মতো বস্তু তৈরি করার চেষ্টা করবেন
Customer c = new Customer();
গ্রাহক.ক্লাসটি রামে লোড করুন। এই মুহুর্তে জেডিকে টুলকিটের ক্লাস.ক্লাস টেম্পলেট অবজেক্ট নামে একটি অবজেক্ট তৈরি করে এবং গ্রাহক.ক্লাসকে সেই টেম্পলেট অবজেক্টে লোড করুন that গ্রাহক.ক্লাসের স্ট্যাটিক সদস্যরা সেই টেমপ্লেট অবজেক্টে বৈশিষ্ট্য এবং পদ্ধতিতে পরিণত হয়।
সুতরাং একটি স্থিতিশীল পদ্ধতি বা বৈশিষ্ট্যেরও একটি অবজেক্ট থাকে
উদাহরণগুলির নীচে ক্লাস এবং অবজেক্ট লকটির মধ্যে আরও স্পষ্টতা দেওয়া হয়েছে, আশা করি নীচের উদাহরণটি অন্যকেও সহায়তা করবে :)
উদাহরণস্বরূপ, আমাদের নীচের পদ্ধতিগুলির মধ্যে একটি রয়েছে ক্লাস অর্জন এবং অন্যটি অবজেক্ট লক অর্জন:
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);
}
}
}
সুতরাং, এখন আমাদের নিম্নলিখিত পরিস্থিতিতে থাকতে পারে:
যখন একই অবজেক্ট ব্যবহার করে থ্রেডগুলি একই সময়ে 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
যখন একই অবজেক্ট ব্যবহার করে থ্রেডগুলি একই সময়ে অ্যাক্সেস 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
যখন বিভিন্ন অবজেক্ট ব্যবহার করে থ্রেডগুলি 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
যখন বিভিন্ন অবজেক্ট ব্যবহার করে থ্রেডগুলি 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
যাঁরা পরিচিত স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতিটি ক্লাস অবজেক্টে লক করে রাখেন যেমন স্ট্রিং ক্লাসের জন্য তার স্ট্রিংক্লাস যখন জাভাতে "এই" কীওয়ার্ড দ্বারা চিহ্নিত অবজেক্টের বর্তমান উদাহরণে সিঙ্ক্রোনাইজড মেথড লক হয়। যেহেতু এই উভয় বস্তু পৃথক পৃথক লক রয়েছে তাই যখন একটি থ্রেড স্থিতিশীল সিঙ্ক্রোনাইজড পদ্ধতিটি চালাচ্ছে তখন জাভাতে অন্যান্য থ্রেডের জন্য সেই থ্রেডটি ফিরে আসার অপেক্ষা রাখে না এটি পরিবর্তে এটি পৃথক লক চিহ্নিত করা বাইট .ক্লাস আক্ষরিক অর্জিত হয় এবং প্রবেশ করায় স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতি।