জাভাতে আমার কখন অ্যাটমিকবুলিয়ান ব্যবহার করা উচিত?


উত্তর:


244

যখন একাধিক থ্রেডের বুলিয়ান চেক এবং পরিবর্তন করা দরকার। উদাহরণ স্বরূপ:

if (!initialized) {
   initialize();
   initialized = true;
}

এটি থ্রেড-নিরাপদ নয়। আপনি এটি ব্যবহার করে এটি ঠিক করতে পারেন AtomicBoolean:

if (atomicInitialized.compareAndSet(false, true)) {
    initialize();
}

51
এটি বাস্তব-বিশ্বের উদাহরণের মতো দেখায় না - অন্যান্য থ্রেড দেখতে পারে trueকখন initialize()সম্পূর্ণ হয় না। সুতরাং, এটি কেবল তখনই কাজ করে যদি অন্যান্য থ্রেডগুলি সম্পূর্ণ হওয়ার বিষয়ে চিন্তা করে না initialize()
axtavt

6
@ অ্যাক্সটভিট: আমি মনে করি এটি যদি initializedএকমাত্র এবং কেবল একটি থ্রেডই initialize()পদ্ধতিতে প্রার্থনা করে তা নিশ্চিত করার জন্য যদি এটি পুরোপুরি বৈধ বাস্তব-বিশ্বের উদাহরণ । একথাও ঠিক যে initializedসত্য যে আরম্ভের মানে এই নয় হচ্ছে স্পষ্টভাবে এই ক্ষেত্রে সম্পন্ন করেছে, তাই হয়তো একটি কিছুটা ভিন্ন মেয়াদে ভাল এখানে হবে। আবার এটি কীসের জন্য ব্যবহৃত হচ্ছে তার উপর নির্ভর করে।
কলিনড

14
আপনার আরম্ভ করা এবং আরম্ভের জন্য 2 বুলিয়ান দরকার হবে, তারপরে প্রথম থ্রেডটি সূচনা করে আর আদ্যক্ষর কল করে (
মার্টিন

3
@Bozho - পড়ে এবং উদ্দেশে চিঠি লেখেন বুলিয়ান ক্ষেত্র পারমাণবিক অধিকার ?, এখন, হয় উদ্বায়ী আমাকে বুলিয়ান মাঠের সর্বশেষ মান দেয়। সুতরাং, কার্যকরভাবে, volatile booleanহিসাবে একই হবে না AtomicBoolean?
TheLostMind 14

2
@ মার্টিন: বুলিয়ান সত্য হওয়ার জন্য অপেক্ষা করার সরাসরি কোনও উপায় নেই; আপনার অতিরিক্ত প্রক্রিয়া দরকার। সর্বাধিক বুদ্ধিমান পন্থা হ'ল একটি synchronizedব্লক ব্যবহার করা, সেক্ষেত্রে আপনার আর দরকার নেই AtomicBoolean, কেবল একটি volatile boolean। ( if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }এটি নিশ্চিত করা হবে যে কেবল একটি থ্রেড কল করেছে initializeএবং অন্য যে সমস্ত থ্রেড এটি initializedচিহ্নিত আছে volatile
সেইভাবে

52

আমি তৈরি করা নোটগুলি ( ব্রায়ান গয়েটজ বই থেকে ) এখানে দেওয়া হয়েছে, এটি আপনার পক্ষে সহায়ক হতে পারে

অ্যাটমিকএক্সএক্সএক্স ক্লাস

  • অ-ব্লকিং তুলনা এবং অদলবদ বাস্তবায়ন সরবরাহ করে

  • হার্ডওয়্যার দ্বারা সরবরাহিত সহায়তার সুবিধা গ্রহণ করে (ইন্টেলের সিএমপিএক্সসিএইচজি নির্দেশ) যখন প্রচুর থ্রেডগুলি আপনার কোডের মাধ্যমে এই পারমাণবিক সম্মতিযুক্ত API ব্যবহার করে, তখন তারা কোডের চেয়ে আরও ভাল স্কেল করবে যা অবজেক্ট স্তর পর্যবেক্ষক / সিঙ্ক্রোনাইজেশন ব্যবহার করে। যেহেতু, জাভা সিঙ্ক্রোনাইজেশন পদ্ধতিগুলি কোডের জন্য অপেক্ষা করে, যখন আপনার সমালোচনামূলক বিভাগগুলির মধ্য দিয়ে প্রচুর থ্রেড চলছে, তখন সিঙ্কইউনাইজেশন প্রক্রিয়াটি নিজেই পরিচালনায় (প্রতীক্ষা, বিজ্ঞপ্তি ইত্যাদি) যথেষ্ট পরিমাণে সিপিইউ সময় ব্যয় করা হয়। যেহেতু নতুন এপিআই থ্রেড-সুরক্ষা বাস্তবায়নের জন্য হার্ডওয়্যার স্তরের কনস্ট্রাক্টস (পারমাণবিক ভেরিয়েবল) এবং অপেক্ষা এবং লক ফ্রি অ্যালগরিদমগুলি ব্যবহার করে, তাই সিপিইউয়ের অনেক বেশি সময় সিঙ্ক্রোনাইজেশন পরিচালনার পরিবর্তে "স্টাফ করা" ব্যয় করে।

  • কেবলমাত্র উন্নততর থ্রুটপুট সরবরাহ করে না, তবে তারা প্রাণবন্ত সমস্যার যেমন ডেডলক এবং অগ্রাধিকারের বিপরীতে আরও প্রতিরোধ সরবরাহ করে।


34

আপনি কেন পরমাণু বুলিয়ান ব্যবহার করতে পারেন তার দুটি প্রধান কারণ রয়েছে। প্রথমে এর পরিবর্তনীয়, আপনি এটি একটি রেফারেন্স হিসাবে পাস করতে পারেন এবং মানটি যা বুলিয়ান নিজেই সম্পর্কিত, এটি পরিবর্তন করতে পারেন।

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);
    }
}

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


4
Godশ্বরের প্রতি ভালবাসার জন্য, এটি কেবলমাত্র বস্তুর নিজেই পরিবর্তনের বিষয়টি দেখানো হয়েছিল। আমি স্পষ্টভাবে লিখেছিলাম যে বিক্ষোভের উদ্দেশ্যে।
জন ভিন্ট

এবং আরও আরও, যদি এটি হচ্ছিল তবে হ্যাঁ, এটি সর্বদা সত্যই ফিরে আসবে
জন ভিন্ট

এটি প্রমাণিত হচ্ছে না এটি থ্রেড-নিরাপদ কিনা। ক্লাসটিকে খুব থ্রেড-নিরাপদ করতে আমি কোডগুলির স্নিপেটগুলি শেষ করতে পারি, তবে এটি কেবল আমার পয়েন্টটি মেরে ফেলে।
জন ভিন্ট

1
আমি মনে করি যে কেবলমাত্র ভোল্টাইলই যথেষ্ট নয়। এমন পরিস্থিতি সম্পর্কে ভাবুন যেখানে দুটি থ্রেড যা মূল স্মৃতি থেকে সরাসরি একই মানটি পড়তে এবং লিখতে পারে, সেই থ্রেডগুলির মধ্যে কোনও সমন্বয় নেই - হ্যান্স সম্মতি সংক্রান্ত সমস্যা দেখা দিতে পারে।
শায়সাদোক

1
আপনি ঠিক বলেছেন যে এটি পারমাণবিক সেটের জন্য পর্যাপ্ত হবে না তবে চেক অপারেশনগুলি হবে, যদিও এই ধারণাটি করার পক্ষে ওপি থেকে যথেষ্ট প্রসঙ্গ ছিল না। বলতে গেলে, অস্থিরতা পর্যাপ্ত হতে পারে না অবশ্যই অবস্থার উপর নির্ভর করে সত্য।
জন ভিন্ট

18

AtomicBooleanশ্রেণী আপনি যদি একটি বুলিয়ান মান যে আপনি atomically আপডেট করতে পারেন দেয়। আপনার যখন বুলিয়ান ভেরিয়েবল অ্যাক্সেস করার একাধিক থ্রেড থাকে তখন এটি ব্যবহার করুন।

Java.util.concurrent.atomic প্যাকেজ ওভারভিউ কি আপনি এই প্যাকেজের ক্লাস এবং যখন তাদের ব্যবহার করার জন্য একটি ভাল উচ্চ পর্যায়ের বর্ণনা দেয়। আমি ব্রায়ান গয়েটস প্র্যাকটিস ইন জাভা কনকুরન્સી বইটিও সুপারিশ করতাম ।


5

থেকে উদ্ধৃতাংশ প্যাকেজ বিবরণ

প্যাকেজ java.util.concurrent.atomic বিবরণ: ক্লাসগুলির একটি ছোট সরঞ্জামকিট যা একক ভেরিয়েবলগুলিতে লক-ফ্রি থ্রেড-নিরাপদ প্রোগ্রামিং সমর্থন করে [[...]

এই পদ্ধতির বৈশিষ্ট্যগুলি সমসাময়িক প্রসেসরের উপর উপলভ্য দক্ষ মেশিন-স্তরের পারমাণবিক নির্দেশাবলী নিয়োগের জন্য প্রয়োগগুলি সক্ষম করে [[...]

অ্যাটমিকবুলিয়ান, অ্যাটমিক ইন্টিজার, অ্যাটমিকলং এবং অ্যাটমিক রেফারেন্সের ক্লাসগুলির উদাহরণ প্রতিটি একই ধরণের একক ভেরিয়েবলের অ্যাক্সেস এবং আপডেট সরবরাহ করে। [...]

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

  • একটি অস্থির পরিবর্তনীয় পড়ার স্মৃতি প্রভাবগুলি পান পান।
  • সেটটিতে একটি অস্থির ভেরিয়েবল লেখার মেমোরি এফেক্ট থাকে (নির্ধারণ করা)।
  • দুর্বলকম্পেরএন্ডসেট পারমাণবিকভাবে একটি চলক পড়ে এবং শর্তসাপেক্ষে একটি ভেরিয়েবল লেখেন, সেই পরিবর্তনশীলটির সাথে অন্য মেমরির ক্রিয়াকলাপের প্রতি শ্রদ্ধার সাথে আদেশ করা হয়, তবে অন্যথায় একটি সাধারণ অ-উদ্বায়ী মেমরি অপারেশন হিসাবে কাজ করে।
  • তুলনাঅ্যান্ডসেট এবং getAndIncrement এর মতো অন্যান্য সমস্ত পঠন-আপডেট আপডেটের অস্থির ভেরিয়েবলগুলি পড়া এবং লেখার উভয়ের স্মৃতি প্রভাব রয়েছে have
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.