আমি নিখুঁত কৌতূহলের বাইরে প্রকৃত উত্স অধ্যয়নের জন্য সময় নিয়েছি এবং এর পিছনে ধারণাটি বেশ সহজ। এই পোস্টটি লেখার সময় সবচেয়ে সাম্প্রতিক সংস্করণটি 3.2.1।
প্রাক-বরাদ্দ ইভেন্টগুলি এমন একটি বাফার সংরক্ষণ করছে যা গ্রাহকদের পড়ার জন্য ডেটা ধারণ করবে।
বাফারকে তার দৈর্ঘ্যের এক ধরণের পতাকা (পূর্ণসংখ্যার অ্যারে) দ্বারা ব্যাক করা হয় যা বাফার স্লটের উপলব্ধতা বর্ণনা করে (বিশদ জন্য আরও দেখুন)। অ্যারেটি একটি জাভা # অ্যাটমিকিন্টেজার অ্যারে এর মতো অ্যাক্সেস করা হয়, সুতরাং এই ব্যাখ্যাটির উদ্দেশ্যে আপনি এটিকে এক হিসাবে ধরে নিতে পারেন।
প্রযোজক যে কোনও সংখ্যক হতে পারে। নির্মাতা যখন বাফারে লিখতে চান, একটি দীর্ঘ সংখ্যা উত্পন্ন হয় (যেমন অ্যাটমিকলং # getAndIncrement কল করার ক্ষেত্রে, বিপর্যয়কারী আসলে তার নিজস্ব বাস্তবায়ন ব্যবহার করে তবে এটি একই পদ্ধতিতে কাজ করে)। আসুন এটিকে উত্সর্গীকৃত দীর্ঘ উত্পাদনকারী কল আইডি বলি। একই উপায়ে, যখন একটি গ্রাহক বাফার থেকে একটি স্লট পড়া শেষ করে তখন গ্রাহকপাল আইডি উত্পন্ন হয়। সর্বাধিক সাম্প্রতিক কনজিউমারক্যালআইডি অ্যাক্সেস করা হয়েছে।
(যদি অনেক ভোক্তা থাকে তবে সর্বনিম্ন আইডি সহ কলটি চুসেন হয়))
এই আইডিগুলি তখন তুলনা করা হয়, এবং যদি উভয়ের মধ্যে পার্থক্য বাফার পার্শ্বের চেয়ে কম হয় তবে নির্মাতাকে লেখার অনুমতি দেওয়া হয়।
(যদি প্রযোজকক্যালআইড সাম্প্রতিক কনজিউমারক্যালআইডি + বাফারসাইজের চেয়ে বেশি হয়, তার অর্থ ব্যাফার পূর্ণ হয়ে গেছে, এবং কোনও জায়গা উপলভ্য না হওয়া পর্যন্ত নির্মাতাকে বাস-অপেক্ষা করতে বাধ্য করা হবে))
প্রযোজককে তার কল আইডের ভিত্তিতে বাফারে স্লট বরাদ্দ করা হয় (যা প্রডুসারক্যালআইডি মডুলো বাফারসাইজ হয়, তবে যেহেতু বাফারসাইজ সর্বদা 2 এর শক্তি (বাফার তৈরির ক্ষেত্রে সীমাবদ্ধ করা হয়), তাই ব্যবহৃত প্রকৃত অপারেশনটি প্রযোজকক্যালআইডি এবং (বাফারসাইজ - 1 ))। তারপরে that স্লটে ইভেন্টটি পরিবর্তন করা বিনামূল্যে free
(আসল অ্যালগরিদমটি আরও জটিল, সাম্প্রতিক গ্রাহককে ক্যাশে জড়িত optim অনুকূলকরণের উদ্দেশ্যে পৃথক পারমাণবিক রেফারেন্সে)
ইভেন্টটি সংশোধন করা হলে, পরিবর্তনটি "প্রকাশিত" হয়। পতাকা অ্যারেতে সম্পর্কিত স্লট প্রকাশের সময় আপডেট হওয়া পতাকাটি পূর্ণ হয়। পতাকা মানটি লুপের সংখ্যা (প্রফেসরক্যালআইডি আইটি বাফারসাইজ দ্বারা বিভক্ত (আবার যেহেতু বাফারসাইজ 2 পাওয়ার, প্রকৃত ক্রিয়াকলাপটি ডান শিফট))।
একই পদ্ধতিতে ভোক্তা যে কোনও সংখ্যা থাকতে পারে। প্রতিবার যখন কোনও গ্রাহক বাফারটি অ্যাক্সেস করতে চান তখন একটি কনজিউমারক্যালআইডি তৈরি করা হয় (আইডি জেনারেশনে ব্যবহৃত পরমাণু ভাগ করে নেওয়া বা তাদের প্রত্যেকের জন্য পৃথক করা হতে পারে কীভাবে গ্রাহকরা বিঘ্নকারীদের সাথে যুক্ত হয়েছিল তার উপর নির্ভর করে)। এই কনজিউমারক্যালআইডিটিকে তারপরে সাম্প্রতিক প্রোডাকসেন্টক্যালআইডি'র সাথে তুলনা করা হয় এবং যদি এটি দুটির চেয়ে কম হয় তবে পাঠককে অগ্রগতির অনুমতি দেওয়া হয়।
(একইভাবে যদি প্রযোজকক্যালআইডি এমনকি ভোক্তা কলআইডের মতো হয় তবে তার অর্থ ব্যারটি খালি এবং গ্রাহক অপেক্ষা করতে বাধ্য হয় waiting বিঘ্ন সৃষ্টিকারী সময়ে ওয়েটস্ট্রেজি দ্বারা অপেক্ষা করার পদ্ধতিটি সংজ্ঞায়িত করা হয়))
পৃথক গ্রাহকদের জন্য (তাদের নিজস্ব আইডি জেনারেটর রয়েছে), পরবর্তী জিনিসটি যাচাই করা হ'ল ব্যাচ সেবন করার ক্ষমতা। বাফারের স্লটগুলি সাম্প্রতিক প্রযোজকক্যালআইডি-র সাথে সম্পর্কিত কনজিউমারক্যালআইডি সম্পর্কিত (সূচকটি নির্মাতাদের জন্য একইভাবে নির্ধারিত হয়) থেকে পরীক্ষা করা হয়।
কনজিউমারক্যালআইডি-র জন্য উত্পাদিত পতাকামূল্যের বিপরীতে পতাকা অ্যারেতে লিখিত পতাকা মানের তুলনা করে এগুলি একটি লুপে পরীক্ষা করা হয়। পতাকাগুলি মিলে গেলে এর অর্থ হ'ল স্লটগুলি পূরণকারী প্রযোজকরা তাদের পরিবর্তনগুলি শুরু করেছেন। যদি তা না হয় তবে লুপটি নষ্ট হয়ে গেছে, এবং সর্বাধিক বহনকারী পরিবর্তনটি ফিরে আসবে। কনজিউমারক্যালআইডি থেকে পরিবর্তন আইডিতে প্রাপ্ত স্লটগুলি ব্যাচে গ্রাস করা যেতে পারে।
যদি একদল গ্রাহক একসাথে (শেয়ার আইডি জেনারেটর সহ) পড়ে থাকেন তবে প্রত্যেকে কেবল একটিই কলআইডি নেয় এবং কেবলমাত্র সেই একক কল আইডির স্লটটি পরীক্ষা করে ফিরে আসে।