জাভা উদ্বায়ী রেফারেন্স বনাম পরমাণু রেফারেন্স


135

কোনও volatileঅবজেক্ট রেফারেন্সের মধ্যে এবং AtomicReferenceআমি কেবল get()এবং set()-মেডথগুলি ব্যবহার করব সে ক্ষেত্রে কি কোনও পার্থক্য আছে AtomicReference?

উত্তর:


114

সংক্ষিপ্ত উত্তর: না।

থেকে java.util.concurrent.atomicপ্যাকেজ ডকুমেন্টেশন। উদ্ধৃতি থেকে:

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

  • getএকটি volatileভেরিয়েবল পড়ার স্মৃতি প্রভাব রয়েছে ।
  • setলেখার মেমোরি ইফেক্ট রয়েছে (নির্ধারিত) একটি volatileভেরিয়েবল।

যাইহোক, সেই ডকুমেন্টেশন খুব ভাল এবং সমস্ত কিছু ব্যাখ্যা করা হয়।


AtomicReference::lazySetএমন একটি নতুন (জাভা 6+) অপারেশন চালু করা হয়েছে যা volatileভেরিয়েবলের মাধ্যমে শব্দার্থবিজ্ঞানের অযোগ্য । আরও তথ্যের জন্য এই পোস্টটি দেখুন ।


11
আর এর উত্তর কি আর হবে?
জুলিয়ান গ্রেনিয়ার

একমত। আমাদের অন্তত একটি লিঙ্ক প্রয়োজন।
জুলিয়ান চেস্তং

2

42

কোন নেই.

অ্যাটমিক রেফারেন্স দ্বারা সরবরাহিত অতিরিক্ত শক্তি হ'ল তুলনাঅ্যান্ডসেট () পদ্ধতি এবং বন্ধুরা। আপনার যদি এই পদ্ধতিগুলির প্রয়োজন না হয় তবে একটি অস্থির রেফারেন্স অ্যাটমিকরেফারেন্স.সেট () এবং .get () এর মতো একই শব্দার্থতন্ত্র সরবরাহ করে।


14

বিভিন্ন পার্থক্য এবং বাণিজ্য বন্ধ রয়েছে:

  1. একটি গেট AtomicReference/ সেট ব্যবহার করে অস্থির ক্ষেত্রের মতো একই রকম জেএমএম শব্দার্থক শব্দ রয়েছে (জাভাডোক যেমন বলে) তবে এটি AtomicReferenceএকটি রেফারেন্সের চারপাশে একটি মোড়ক, তাই ক্ষেত্রটিতে যে কোনও অ্যাক্সেসের সাথে আরও একটি পয়েন্টার তাড়া জড়িত

  2. মেমরি পদাঙ্ক গুন করা হয় (ক সংকুচিত ওহো পরিবেশ, যা সর্বাধিক ভার্চুয়াল মেশিনের জন্য সত্য অভিমানী):

    • উদ্বায়ী রেফ = 4 বি
    • AtomicReference = 4 বি + 16 বি (12 বি অবজেক্ট শিরোনাম + 4 বি রেফ ক্ষেত্র)
  3. AtomicReferenceএকটি অস্থির রেফারেন্সের চেয়ে সমৃদ্ধ এপিআই সরবরাহ করে। আপনি একটি ব্যবহার করে AtomicFieldUpdaterবা জাভা 9 এ এর মাধ্যমে অস্থির রেফারেন্সের জন্য এপিআই আবার পেতে পারেন VarHandle। আপনি sun.misc.Unsafeযদি কাঁচি দিয়ে দৌড়াতে চান তবে আপনি সরাসরিও পৌঁছে যেতে পারেন। AtomicReferenceনিজেই ব্যবহার করে প্রয়োগ করা হয় Unsafe

সুতরাং, কখন অন্যটির থেকে একটি বেছে নেওয়া ভাল:

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

7

এই জাতীয় বিভ্রান্তির জবাব দেওয়ার সর্বোত্তম উপায়গুলির মধ্যে জেডিকে উত্স কোড । আপনি যদি অ্যাটমিক রেফারেন্সে কোডটি দেখেন তবে এটি অবজেক্ট স্টোরেজের জন্য একটি ভোলটি ভেরিয়েবল ব্যবহার করে।

private volatile V value;

সুতরাং, স্পষ্টতই যদি আপনি অ্যাটমিকরেফারেন্সিতে get () এবং সেট () সেট করতে যাচ্ছেন তবে এটি একটি উদ্বায়ী ভেরিয়েবল ব্যবহার করার মতো। তবে অন্যান্য পাঠকরা যেমন মন্তব্য করেছেন, অ্যাটমিক রেফারেন্স অতিরিক্ত সিএএস শব্দার্থবিদ্যা সরবরাহ করে। সুতরাং, প্রথমে সিদ্ধান্ত নিন আপনি সিএএস শব্দার্থক চান বা না, এবং যদি আপনি কেবল তখনই অ্যাটমিকরেফারেন্স ব্যবহার করেন।


13
"জেডিকে উত্স কোডটি এরকম বিভ্রান্তির জবাব দেওয়ার অন্যতম সেরা উপায়" => আমি অগত্যা একমত হই না - জাভাদোক (যা শ্রেণীর চুক্তি) সর্বোত্তম উপায়। কোডটিতে আপনি যা সন্ধান করেন তা নির্দিষ্ট প্রয়োগের জন্য প্রশ্নের উত্তর দেয় তবে কোড পরিবর্তন হতে পারে।
Assylias

4
উদাহরণ হিসেবে বলা যায় এই পরিবর্তনশীল hashmap মধ্যে JDK 6 উদ্বায়ী ছিল কিন্তু না উদ্বায়ী আর জাভা 7. আপনি ভিত্তি করে যে পরিবর্তনশীল উদ্বায়ী ছিল আপনার কোড, এটা যখন আপনার JDK ugrading বিচ্ছিন্ন হয়ে যেতো হচ্ছে ... বোঝা যাচ্ছে যে নেতারা উদাহরণ ভিন্ন কিন্তু আপনি পয়েন্ট পেতে।
assylias

এটি কি সিএএসের কিছু স্ট্যান্ডার্ড সংক্ষেপণ?
আব্বাস

1
তুলনা করুন এবং অদলবদল করুন)
অন্তহীন

4

AtomicReferenceএকটি সরল উদ্বায়ী ভেরিয়েবল সরবরাহ করে না এমন অতিরিক্ত কার্যকারিতা সরবরাহ করে। আপনি যেমন API জাভাদোকটি পড়েছেন আপনি এটি জানতে পারবেন তবে এটি একটি লক সরবরাহ করে যা কিছু ক্রিয়াকলাপের জন্য দরকারী।

তবে আপনার যদি এই অতিরিক্ত কার্যকারিতাটির প্রয়োজন না হয় তবে আমি আপনাকে একটি সমতল volatileক্ষেত্র ব্যবহার করার পরামর্শ দিচ্ছি ।


সুতরাং পার্থক্য, তারপর, তাদের অভিনয় হয়। যদি কোনও পার্থক্য না থেকে থাকে তবে আপনি কখনও অন্যটির ওপরে ব্যবহার করার পরামর্শ দিবেন না।
বিটি

পারফরম্যান্স অনেক একই। একটি অ্যাটমিকেরফেরেন্স জটিলতা এবং মেমরির ব্যবহার যুক্ত করে।
পিটার ল্যারি

@ বিটি একটি volatileক্ষেত্রটি কোনও নিয়মিত ক্ষেত্রের মতো ব্যবহার করা যেতে পারে যেখানে মানটি অ্যাক্সেসের AtomicReferenceমধ্য দিয়ে যাওয়া getএবং setপদ্ধতিগুলি প্রয়োজন।
ডেভিড হার্কনেস

0

কখনও কখনও এমনকি যদি আপনি কেবল গেটস এবং সেট ব্যবহার করেন তবে অ্যাটমিক রেফারেন্স ভাল পছন্দ হতে পারে:

অস্থির সঙ্গে উদাহরণ:

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;

তবে দ্বিতীয়টি সম্ভবত "কোড সাফাই" চলাকালীন ভবিষ্যতে দুর্ঘটনাক্রমে কারও দ্বারা অপসারণের সম্ভাবনা বেশি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.