উত্তর:
যখন একাধিক থ্রেডের বুলিয়ান চেক এবং পরিবর্তন করা দরকার। উদাহরণ স্বরূপ:
if (!initialized) {
initialize();
initialized = true;
}
এটি থ্রেড-নিরাপদ নয়। আপনি এটি ব্যবহার করে এটি ঠিক করতে পারেন AtomicBoolean
:
if (atomicInitialized.compareAndSet(false, true)) {
initialize();
}
true
কখন initialize()
সম্পূর্ণ হয় না। সুতরাং, এটি কেবল তখনই কাজ করে যদি অন্যান্য থ্রেডগুলি সম্পূর্ণ হওয়ার বিষয়ে চিন্তা করে না initialize()
।
initialized
একমাত্র এবং কেবল একটি থ্রেডই initialize()
পদ্ধতিতে প্রার্থনা করে তা নিশ্চিত করার জন্য যদি এটি পুরোপুরি বৈধ বাস্তব-বিশ্বের উদাহরণ । একথাও ঠিক যে initialized
সত্য যে আরম্ভের মানে এই নয় হচ্ছে স্পষ্টভাবে এই ক্ষেত্রে সম্পন্ন করেছে, তাই হয়তো একটি কিছুটা ভিন্ন মেয়াদে ভাল এখানে হবে। আবার এটি কীসের জন্য ব্যবহৃত হচ্ছে তার উপর নির্ভর করে।
volatile boolean
হিসাবে একই হবে না AtomicBoolean
?
synchronized
ব্লক ব্যবহার করা, সেক্ষেত্রে আপনার আর দরকার নেই AtomicBoolean
, কেবল একটি volatile boolean
। ( if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
এটি নিশ্চিত করা হবে যে কেবল একটি থ্রেড কল করেছে initialize
এবং অন্য যে সমস্ত থ্রেড এটি initialized
চিহ্নিত আছে volatile
আমি তৈরি করা নোটগুলি ( ব্রায়ান গয়েটজ বই থেকে ) এখানে দেওয়া হয়েছে, এটি আপনার পক্ষে সহায়ক হতে পারে
অ্যাটমিকএক্সএক্সএক্স ক্লাস
অ-ব্লকিং তুলনা এবং অদলবদ বাস্তবায়ন সরবরাহ করে
হার্ডওয়্যার দ্বারা সরবরাহিত সহায়তার সুবিধা গ্রহণ করে (ইন্টেলের সিএমপিএক্সসিএইচজি নির্দেশ) যখন প্রচুর থ্রেডগুলি আপনার কোডের মাধ্যমে এই পারমাণবিক সম্মতিযুক্ত API ব্যবহার করে, তখন তারা কোডের চেয়ে আরও ভাল স্কেল করবে যা অবজেক্ট স্তর পর্যবেক্ষক / সিঙ্ক্রোনাইজেশন ব্যবহার করে। যেহেতু, জাভা সিঙ্ক্রোনাইজেশন পদ্ধতিগুলি কোডের জন্য অপেক্ষা করে, যখন আপনার সমালোচনামূলক বিভাগগুলির মধ্য দিয়ে প্রচুর থ্রেড চলছে, তখন সিঙ্কইউনাইজেশন প্রক্রিয়াটি নিজেই পরিচালনায় (প্রতীক্ষা, বিজ্ঞপ্তি ইত্যাদি) যথেষ্ট পরিমাণে সিপিইউ সময় ব্যয় করা হয়। যেহেতু নতুন এপিআই থ্রেড-সুরক্ষা বাস্তবায়নের জন্য হার্ডওয়্যার স্তরের কনস্ট্রাক্টস (পারমাণবিক ভেরিয়েবল) এবং অপেক্ষা এবং লক ফ্রি অ্যালগরিদমগুলি ব্যবহার করে, তাই সিপিইউয়ের অনেক বেশি সময় সিঙ্ক্রোনাইজেশন পরিচালনার পরিবর্তে "স্টাফ করা" ব্যয় করে।
কেবলমাত্র উন্নততর থ্রুটপুট সরবরাহ করে না, তবে তারা প্রাণবন্ত সমস্যার যেমন ডেডলক এবং অগ্রাধিকারের বিপরীতে আরও প্রতিরোধ সরবরাহ করে।
আপনি কেন পরমাণু বুলিয়ান ব্যবহার করতে পারেন তার দুটি প্রধান কারণ রয়েছে। প্রথমে এর পরিবর্তনীয়, আপনি এটি একটি রেফারেন্স হিসাবে পাস করতে পারেন এবং মানটি যা বুলিয়ান নিজেই সম্পর্কিত, এটি পরিবর্তন করতে পারেন।
public final class MyThreadSafeClass{
private AtomicBoolean myBoolean = new AtomicBoolean(false);
private SomeThreadSafeObject someObject = new SomeThreadSafeObject();
public boolean doSomething(){
someObject.doSomeWork(myBoolean);
return myBoolean.get(); //will return true
}
}
এবং কিছু অবজেক্ট ক্লাসে
public final class SomeThreadSafeObject{
public void doSomeWork(AtomicBoolean b){
b.set(true);
}
}
আরও গুরুত্বপূর্ণ বিষয় যদিও এটির থ্রেডটি নিরাপদ এবং বিকাশকারীদের ক্লাস বজায় রাখতে ইঙ্গিত করতে পারে যে এই পরিবর্তনশীলটি একাধিক থ্রেড থেকে সংশোধন করা এবং পড়ার আশা করা হচ্ছে। আপনি যদি অ্যাটমিকবুলিয়ান ব্যবহার না করেন তবে আপনাকে অবশ্যই বুলিয়ান ভেরিয়েবলটি অস্থির হিসাবে ঘোষণা করে বা ক্ষেত্রের পড়া এবং লেখার চারপাশে সুসংগত করে সিঙ্ক্রোনাইজ করতে হবে।
AtomicBoolean
শ্রেণী আপনি যদি একটি বুলিয়ান মান যে আপনি atomically আপডেট করতে পারেন দেয়। আপনার যখন বুলিয়ান ভেরিয়েবল অ্যাক্সেস করার একাধিক থ্রেড থাকে তখন এটি ব্যবহার করুন।
Java.util.concurrent.atomic প্যাকেজ ওভারভিউ কি আপনি এই প্যাকেজের ক্লাস এবং যখন তাদের ব্যবহার করার জন্য একটি ভাল উচ্চ পর্যায়ের বর্ণনা দেয়। আমি ব্রায়ান গয়েটস প্র্যাকটিস ইন জাভা কনকুরન્સી বইটিও সুপারিশ করতাম ।
থেকে উদ্ধৃতাংশ প্যাকেজ বিবরণ
প্যাকেজ java.util.concurrent.atomic বিবরণ: ক্লাসগুলির একটি ছোট সরঞ্জামকিট যা একক ভেরিয়েবলগুলিতে লক-ফ্রি থ্রেড-নিরাপদ প্রোগ্রামিং সমর্থন করে [[...]
এই পদ্ধতির বৈশিষ্ট্যগুলি সমসাময়িক প্রসেসরের উপর উপলভ্য দক্ষ মেশিন-স্তরের পারমাণবিক নির্দেশাবলী নিয়োগের জন্য প্রয়োগগুলি সক্ষম করে [[...]
অ্যাটমিকবুলিয়ান, অ্যাটমিক ইন্টিজার, অ্যাটমিকলং এবং অ্যাটমিক রেফারেন্সের ক্লাসগুলির উদাহরণ প্রতিটি একই ধরণের একক ভেরিয়েবলের অ্যাক্সেস এবং আপডেট সরবরাহ করে। [...]
অ্যাটিক্সের অ্যাক্সেস এবং আপডেটের জন্য মেমরি প্রভাবগুলি সাধারণত উদ্বায়ীদের নিয়মগুলি অনুসরণ করে:
- একটি অস্থির পরিবর্তনীয় পড়ার স্মৃতি প্রভাবগুলি পান পান।
- সেটটিতে একটি অস্থির ভেরিয়েবল লেখার মেমোরি এফেক্ট থাকে (নির্ধারণ করা)।
- দুর্বলকম্পেরএন্ডসেট পারমাণবিকভাবে একটি চলক পড়ে এবং শর্তসাপেক্ষে একটি ভেরিয়েবল লেখেন, সেই পরিবর্তনশীলটির সাথে অন্য মেমরির ক্রিয়াকলাপের প্রতি শ্রদ্ধার সাথে আদেশ করা হয়, তবে অন্যথায় একটি সাধারণ অ-উদ্বায়ী মেমরি অপারেশন হিসাবে কাজ করে।
- তুলনাঅ্যান্ডসেট এবং getAndIncrement এর মতো অন্যান্য সমস্ত পঠন-আপডেট আপডেটের অস্থির ভেরিয়েবলগুলি পড়া এবং লেখার উভয়ের স্মৃতি প্রভাব রয়েছে have
volatile boolean
বনামAtomicBoolean
: stackoverflow.com/questions/3786825/...