উত্তর:
সংক্ষিপ্ত উত্তর: না।
থেকে java.util.concurrent.atomic
প্যাকেজ ডকুমেন্টেশন। উদ্ধৃতি থেকে:
অ্যাটিক্সের অ্যাক্সেস এবং আপডেটের জন্য মেমরি প্রভাবগুলি সাধারণত উদ্বায়ীদের নিয়মগুলি অনুসরণ করে:
get
একটিvolatile
ভেরিয়েবল পড়ার স্মৃতি প্রভাব রয়েছে ।set
লেখার মেমোরি ইফেক্ট রয়েছে (নির্ধারিত) একটিvolatile
ভেরিয়েবল।
যাইহোক, সেই ডকুমেন্টেশন খুব ভাল এবং সমস্ত কিছু ব্যাখ্যা করা হয়।
AtomicReference::lazySet
এমন একটি নতুন (জাভা 6+) অপারেশন চালু করা হয়েছে যা volatile
ভেরিয়েবলের মাধ্যমে শব্দার্থবিজ্ঞানের অযোগ্য । আরও তথ্যের জন্য এই পোস্টটি দেখুন ।
বিভিন্ন পার্থক্য এবং বাণিজ্য বন্ধ রয়েছে:
একটি গেট AtomicReference
/ সেট ব্যবহার করে অস্থির ক্ষেত্রের মতো একই রকম জেএমএম শব্দার্থক শব্দ রয়েছে (জাভাডোক যেমন বলে) তবে এটি AtomicReference
একটি রেফারেন্সের চারপাশে একটি মোড়ক, তাই ক্ষেত্রটিতে যে কোনও অ্যাক্সেসের সাথে আরও একটি পয়েন্টার তাড়া জড়িত ।
মেমরি পদাঙ্ক গুন করা হয় (ক সংকুচিত ওহো পরিবেশ, যা সর্বাধিক ভার্চুয়াল মেশিনের জন্য সত্য অভিমানী):
AtomicReference
= 4 বি + 16 বি (12 বি অবজেক্ট শিরোনাম + 4 বি রেফ ক্ষেত্র)AtomicReference
একটি অস্থির রেফারেন্সের চেয়ে সমৃদ্ধ এপিআই সরবরাহ করে। আপনি একটি ব্যবহার করে AtomicFieldUpdater
বা জাভা 9 এ এর মাধ্যমে অস্থির রেফারেন্সের জন্য এপিআই আবার পেতে পারেন VarHandle
। আপনি sun.misc.Unsafe
যদি কাঁচি দিয়ে দৌড়াতে চান তবে আপনি সরাসরিও পৌঁছে যেতে পারেন। AtomicReference
নিজেই ব্যবহার করে প্রয়োগ করা হয় Unsafe
।
সুতরাং, কখন অন্যটির থেকে একটি বেছে নেওয়া ভাল:
AtomicReference
/ AtomicFieldUpdater
/ Unsafe
যেখানে আপনি আপনার পারফরম্যান্স লাভের জন্য পঠনযোগ্যতা এবং ঝুঁকিতে অর্থ প্রদান করতে চান তার মধ্যে একটি পছন্দ করে নিন। এটি যদি কোনও সংবেদনশীল অঞ্চল না হয় তবে সন্ধান করুন AtomicReference
। লাইব্রেরি লেখকরা সাধারণত লক্ষ্যযুক্ত জেডিকে, প্রত্যাশিত এপিআই বিধিনিষেধ, মেমরির সীমাবদ্ধতা এবং এর উপর নির্ভর করে এই পদ্ধতির মিশ্রণ ব্যবহার করেন।এই জাতীয় বিভ্রান্তির জবাব দেওয়ার সর্বোত্তম উপায়গুলির মধ্যে জেডিকে উত্স কোড । আপনি যদি অ্যাটমিক রেফারেন্সে কোডটি দেখেন তবে এটি অবজেক্ট স্টোরেজের জন্য একটি ভোলটি ভেরিয়েবল ব্যবহার করে।
private volatile V value;
সুতরাং, স্পষ্টতই যদি আপনি অ্যাটমিকরেফারেন্সিতে get () এবং সেট () সেট করতে যাচ্ছেন তবে এটি একটি উদ্বায়ী ভেরিয়েবল ব্যবহার করার মতো। তবে অন্যান্য পাঠকরা যেমন মন্তব্য করেছেন, অ্যাটমিক রেফারেন্স অতিরিক্ত সিএএস শব্দার্থবিদ্যা সরবরাহ করে। সুতরাং, প্রথমে সিদ্ধান্ত নিন আপনি সিএএস শব্দার্থক চান বা না, এবং যদি আপনি কেবল তখনই অ্যাটমিকরেফারেন্স ব্যবহার করেন।
AtomicReference
একটি সরল উদ্বায়ী ভেরিয়েবল সরবরাহ করে না এমন অতিরিক্ত কার্যকারিতা সরবরাহ করে। আপনি যেমন API জাভাদোকটি পড়েছেন আপনি এটি জানতে পারবেন তবে এটি একটি লক সরবরাহ করে যা কিছু ক্রিয়াকলাপের জন্য দরকারী।
তবে আপনার যদি এই অতিরিক্ত কার্যকারিতাটির প্রয়োজন না হয় তবে আমি আপনাকে একটি সমতল volatile
ক্ষেত্র ব্যবহার করার পরামর্শ দিচ্ছি ।
volatile
ক্ষেত্রটি কোনও নিয়মিত ক্ষেত্রের মতো ব্যবহার করা যেতে পারে যেখানে মানটি অ্যাক্সেসের AtomicReference
মধ্য দিয়ে যাওয়া get
এবং set
পদ্ধতিগুলি প্রয়োজন।
কখনও কখনও এমনকি যদি আপনি কেবল গেটস এবং সেট ব্যবহার করেন তবে অ্যাটমিক রেফারেন্স ভাল পছন্দ হতে পারে:
অস্থির সঙ্গে উদাহরণ:
private volatile Status status;
...
public setNewStatus(Status newStatus){
status = newStatus;
}
public void doSomethingConditionally() {
if(status.isOk()){
System.out.println("Status is ok: " + status); // here status might not be OK anymore because in the meantime some called setNewStatus(). setNewStatus should be synchronized
}
}
অ্যাটমিক রেফারেন্স সহ বাস্তবায়ন আপনাকে নিখরচায় একটি অনুলিপি সংকলন দেয়।
private AtomicReference<Status> statusWrapper;
...
public void doSomethingConditionally() {
Status status = statusWrapper.get();
if(status.isOk()){
System.out.println("Status is ok: " + status); // here even if in the meantime some called setNewStatus() we're still referring to the old one
}
}
কেউ বলতে পারে যে আপনি যদি প্রতিস্থাপন করেন তবে আপনার কাছে একটি সঠিক অনুলিপি থাকতে পারে:
Status status = statusWrapper.get();
সঙ্গে:
Status statusCopy = status;
তবে দ্বিতীয়টি সম্ভবত "কোড সাফাই" চলাকালীন ভবিষ্যতে দুর্ঘটনাক্রমে কারও দ্বারা অপসারণের সম্ভাবনা বেশি।