.Class জন্য জাভা সিঙ্ক্রোনাইজড ব্লক


102

এই জাভা কোডটির অর্থ কী? এটি কি সমস্ত বস্তুতে লক লাভ করবে MyClass?

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

এবং উপরের কোডটি কীভাবে এটির থেকে আলাদা হয়:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}

সম্পর্কিত: stackoverflow.com/questions/437620/...
finnw

উত্তর:


144

স্নিপেট synchronized(X.class)ক্লাস উদাহরণটি মনিটরের হিসাবে ব্যবহার করে। যেহেতু কেবলমাত্র একটি শ্রেণীর উদাহরণ রয়েছে (রানটাইম সময়ে শ্রেণি মেটাডেটা উপস্থাপন করে এমন বস্তু) এই ব্লকে একটি থ্রেড থাকতে পারে।

সঙ্গে synchronized(this)ব্লক উদাহরণস্বরূপ দ্বারা সুরক্ষিত হয়। প্রতিটি উদাহরণের জন্য কেবল একটি থ্রেড ব্লকে প্রবেশ করতে পারে।

synchronized(X.class)ব্লকটিতে ঠিক একটি থ্রেড রয়েছে কিনা তা নিশ্চিত করতে ব্যবহার করা হয়। synchronized(this)উদাহরণস্বরূপ ঠিক এক থ্রেড রয়েছে তা নিশ্চিত করে। এটি যদি ব্লক থ্রেড-সেফের আসল কোডটি বাস্তবায়নের উপর নির্ভর করে। পরিবর্তিত হলে কেবলমাত্র উদাহরণের synchronized(this)অবস্থা যথেষ্ট state


6
"উদাহরণ হিসাবে যেমন অনেকগুলি থ্রেড ব্লকে প্রবেশ করতে পারে" বোঝায় যে দ্বিতীয় ফর্মটি সেমফোর হিসাবে কাজ করে যা সত্য নয়। আপনার মতো কিছু বলা উচিত: "সিঙ্ক্রোনাইজড (এটি) নিশ্চিত করে যে কেবলমাত্র একটি থ্রেড ক্লাসের নির্দিষ্ট উদাহরণের জন্য ব্লকে প্রবেশ করতে পারে"।
liwp

সংশোধন। আমি এটা বলতে ইচ্ছা করেছিলাম।
টমাস জং

2
উদাহরণস্বরূপ শ্রেণীর উদাহরণটি কী?
ওয়েশি জেং

সুতরাং, যদি আপনার একটি স্থিতিশীল পদ্ধতি থাকে এবং আমরা এর সমস্ত শরীরের সিঙ্ক্রোনাইজ করতে চাই না, তবে আমরা সিঙ্ক্রোনাইজ করেছি (এটি) ভাল নয়, পরিবর্তে সিঙ্ক্রোনাইজ করা (Foo.class) উপযুক্ত। এটা কি সঠিক?
krupal.agile

84

অন্যান্য উত্তর যুক্ত করতে:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

সমতুল্য

static synchronized void myMethod() {
  //code
}

এবং

void myMethod() {
  synchronized(this) {
    //code
  }
}

সমতুল্য

synchronized void myMethod() {
  //code
}

12
প্রথম দুটি উদাহরণের মূল শব্দ "স্ট্যাটিক" রয়েছে তা ধরতে আমার দ্বিতীয় পড়া লাগল took এটি অন্যদের দিকে ইঙ্গিত করা যাঁরা এটি দেখে এবং এটি মিস করেছেন। স্ট্যাটিক কীওয়ার্ড ব্যতীত প্রথম দুটি উদাহরণ একই রকম হবে না।
কুর্তজবট

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

পাবলিক স্ট্যাটিক সিঙ্গলটন getInstance () {যদি (উদাহরণ == নাল) nch সিঙ্ক্রোনাইজড (সিঙ্গলটন.ক্লাস) {উদাহরণ = নতুন সিঙ্গলটন (); }} রিটার্ন উদাহরণ; }
জ্যাকসঅনএফ 1

2
পুরো পয়েন্ট সেখানে যে হয় বাহিরে কোন কোড synchronizedব্লক। এটি তাদের সমতুল্য করে তোলে। আপনি যদি একটি উদাহরণ পরিবর্তন করেন তবে সেগুলি আর আগের মতো থাকবে না।
উয়র্ন

22

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

দ্বিতীয়টি কেবলমাত্র বর্তমান ইভেন্টে একটি লক পাবেন।

এটি আপনার বস্তুগুলিকে থ্রেড সুরক্ষিত করে কিনা, তা আরও জটিল প্রশ্ন - আমাদের আপনার কোডটি দেখতে হবে!


1
হ্যাঁ, MyClass.class কোনও স্থির পরিবর্তনশীল হতে পারে এবং একই প্রভাব থাকতে পারে effect
pstanton
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.