লিংকডব্লকিংকুইউ বনাম কনক্র্যান্টলিঙ্কড কিউ


112

আমার প্রশ্নটি আগে জিজ্ঞাসিত এই প্রশ্নের সাথে সম্পর্কিত । আমি যে পরিস্থিতিতে উত্পাদক এবং ভোক্তা থ্রেডের মধ্যে যোগাযোগের জন্য একটি সারি ব্যবহার করছি সেখানে লোকেরা সাধারণত ব্যবহারের পরামর্শ দেয় LinkedBlockingQueueবা ConcurrentLinkedQueue?

একে অপরকে ব্যবহার করার সুবিধা / অসুবিধাগুলি কী?

আমি একটি এপিআই দৃষ্টিকোণ থেকে প্রধান পার্থক্যটি হ'ল একটি হ'ল LinkedBlockingQueueoptionচ্ছিকভাবে সীমাবদ্ধ।

উত্তর:


110

প্রযোজক / গ্রাহক থ্রেডের জন্য, আমি নিশ্চিত নই যে ConcurrentLinkedQueueএটি এমনকি একটি যুক্তিসঙ্গত বিকল্প - এটি বাস্তবায়ন করে না BlockingQueue, যা প্রযোজক / গ্রাহক সারি আইএমওর জন্য মূল ইন্টারফেস। আপনাকে ফোন করতে হবে poll(), যদি আপনি কিছু না পেয়ে থাকেন তবে কিছুক্ষণ অপেক্ষা করুন এবং তারপরে আবার জরিপ করুন ইত্যাদি ... নতুন আইটেম এলে বিলম্ব হয় এবং শূন্য হলে অদক্ষতা (ঘুম থেকে অকারণে জেগে ওঠার কারণে) ।

ব্লকিংকুইয়ের জন্য দস্তাবেজগুলি থেকে:

BlockingQueue বাস্তবায়নগুলি প্রাথমিকভাবে উত্পাদক-ভোক্তা সারিগুলির জন্য ব্যবহার করার জন্য ডিজাইন করা হয়েছে

আমি জানি এটি কঠোরভাবে বলতে পারে না যে কেবলমাত্র ব্লক করা সারিগুলি প্রযোজক-ভোক্তা সারিগুলির জন্য ব্যবহার করা উচিত, তবে তবুও ...


4
ধন্যবাদ জোন - আমি এটা লক্ষ্য করিনি। তাহলে আপনি কোথায় / কেন সাম্প্রতিক লিঙ্কযুক্ত কিউ ব্যবহার করবেন?
অ্যাডামস্কি

27
যখন আপনাকে প্রচুর থ্রেড থেকে কাতারে প্রবেশ করতে হবে তবে আপনাকে এটিতে "অপেক্ষা" করতে হবে না।
জন স্কিটি

2
একজন ConcurrentLinkedQueueযদি আপনার থ্রেড একাধিক সারি পরীক্ষণ এছাড়াও দরকারী। উদাহরণস্বরূপ, একটি বহু-ভাড়াটে সার্ভারে। বিচ্ছিন্নতার কারণে ধরে নেওয়া আপনি এর পরিবর্তে কোনও একক ব্লকিং সারি এবং ভাড়াটে বৈষম্যমূলক ব্যবহার করবেন না।
পার্শ্ববর্তী ফ্র্যাক্টাল

আপনার কেসটি কেবল সত্য হলেই আমরা সীমানাযুক্ত সারিটি আনবাউন্ডেড কাতারে ব্যবহার করি take()এবং put()কেবলমাত্র অতিরিক্ত সংস্থান (সিঙ্ক্রোনাইজেশনের অন্তর্বর্তী) ব্যয় করি ConcurrentLinkedQueue । যদিও প্রযোজক-ভোক্তা পরিস্থিতিগুলির
অমরনাথ হরিশ

@ অ্যাডামস্কি আইএমও, সাম্প্রতিক লিঙ্কযুক্ত কিউইউ কেবলমাত্র একটি লিঙ্কযুক্ত তালিকা যা বহু থ্রেডযুক্ত পরিবেশে ব্যবহার করা যেতে পারে। এর জন্য সেরা উপমাটি হবে কনকন্ট্র্যান্ট হ্যাশম্যাপ এবং হ্যাশম্যাপ।
নিশিত

69

এই প্রশ্নটি আরও ভাল উত্তর প্রাপ্য।

জাভা ম্যাগেড এম এম মাইকেল এবং মাইকেল এল স্কট-অ-ব্লকিং লক-মুক্ত সারির জন্য ConcurrentLinkedQueueবিখ্যাত অ্যালগরিদমের উপর ভিত্তি করে তৈরি ।

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

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

এটি একটি হিসাবে BlockingQueueভাল না, একটি সারিতে অপেক্ষা করার জন্য একটি থ্রেড ব্লক করা সমকালীন সিস্টেমগুলি ডিজাইনের একটি অদ্ভুত ভয়ঙ্কর উপায়। না। আপনি যদি ConcurrentLinkedQueueকোনও ভোক্তা / প্রযোজক দৃশ্যে কীভাবে ব্যবহার করবেন তা অনুভব করতে না পারেন , তবে কেবল ভাল অভিনেতার কাঠামোর মতো উচ্চ স্তরের বিমূর্তিগুলিতে স্যুইচ করুন।


8
আপনার শেষ অনুচ্ছেদে, আপনি কেন বলেছেন যে একটি সারিতে অপেক্ষা করা সমবর্তী সিস্টেমগুলি ডিজাইনের একটি ভয়ঙ্কর উপায়? যদি আমাদের কাছে একটি টাস্ক্যু থেকে 10 টি থ্রেড খাওয়ার কাজগুলির সাথে থ্রেডগ্রুপ থাকে তবে যখন টাস্ক্যুতে 10 টিরও কম টাস্ক থাকে তখন ব্লক করার ক্ষেত্রে কী সমস্যা?
পেসারিয়ার

11
@AlexandruNedelcu আপনি মত "freakishly ভয়ংকর" যেখানে খুব প্রায়ই খুব অভিনেতা অবকাঠামো আপনাকে ব্যবহার ব্যবহারের threadpools যা নিজেদের আপনি বলতে একটি সুদূরপ্রসারী বিবৃতি করতে পারবেন না BlockingQueue এর। আপনার যদি একটি অত্যন্ত প্রতিক্রিয়াশীল সিস্টেমের প্রয়োজন হয় এবং আপনি ননব্লকিংয়ের চেয়ে ব্যাকপ্রেসার (কীভাবে অবরুদ্ধ সারিগুলি হ্রাসকারী কিছু) মোকাবেলা করতে চান তা স্পষ্টভাবে উচ্চতর। তবে .. প্রায়শই আইও ব্লক করা এবং সারিগুলি ব্লক করা ননব্লকিং সম্পাদন করতে পারে বিশেষত যদি আপনার দীর্ঘকালীন চলমান কাজগুলি থাকে যা আইও আবদ্ধ থাকে এবং বিভক্ত না হয় que
অ্যাডাম জেন্ট

1
@ অ্যাডামজেন্ট - অভিনেতা ফ্রেমওয়ার্কগুলিতে ব্লক করা সারিগুলির উপর ভিত্তি করে মেলবাক্সগুলির প্রয়োগ রয়েছে, তবে এটি আমার মতে একটি ত্রুটি, কারণ ব্লক করা অ্যাসিঙ্ক্রোনাস সীমানার উপর কাজ করে না এবং এইভাবে কেবল ডেমোতে কাজ করে। আমার জন্য এটি হতাশার কারণ হয়ে দাঁড়িয়েছে, যেমন উদাহরণস্বরূপ, আকা'র ওভারফ্লো নিয়ে কাজ করার ধারণাটি বার্তাগুলি ছাড়ার পরিবর্তে, ব্লক করা, সংস্করণ ২.৪ অবধি, যা এখনও বের হয়নি। এটি বলেছিল যে আমি বিশ্বাস করি না যে এমন কিছু ব্যবহার-মামলা রয়েছে যার জন্য ব্লক করা সারি আরও ভাল হতে পারে। আপনি দুটি জিনিসও বিবাদ করছেন যা সংঘাতের মধ্যে থাকা উচিত নয়। আমি / ওকে ব্লক করার বিষয়ে কথা বলিনি।
আলেকজান্দ্রু নেদেলকু

1
@ আলেকজান্দ্রনুডেলকু যখন আমি সাধারণত ব্যাকপ্রেসে আপনার সাথে একমত হই তখনও উপরে থেকে নীচে একটি "লক ফ্রি" সিস্টেম দেখতে পাইনি। প্রযুক্তি কোথাও কোথাও এর নোড.জেএস, এরলং, গোলং, এটি কিছুটা অপেক্ষার কৌশল ব্যবহার করে তা সে ব্লককুই (লকস) বা সিএএস তার ব্লকিং স্পিনি করে এবং কিছু ক্ষেত্রে traditionalতিহ্যবাহী লক কৌশলটি দ্রুততর হয়। ধারাবাহিকতার কারণে লক না রাখা খুব শক্ত এবং এটি আইও এবং শিডিয়ুলারগুলি ocking প্রযোজক / গ্রাহক are ফোর্কজইনপুল সংক্ষিপ্ত চলমান কাজগুলির সাথে কাজ করে এবং এটিতে এখনও সিএএস স্পিনিং লক রয়েছে।
অ্যাডাম জেন্ট ১৯

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

33

LinkedBlockingQueueসারিটি খালি বা পূর্ণ হলে গ্রাহক বা উত্পাদককে অবরুদ্ধ করে এবং সংশ্লিষ্ট গ্রাহক / প্রযোজক থ্রেডকে ঘুমিয়ে দেওয়া হয়। তবে এই ব্লকিং বৈশিষ্ট্যটি একটি ব্যয় সহ আসে: উত্পাদক বা ভোক্তাদের (প্রতিটি যদি হয়) প্রতিটি পুট বা নেওয়া অপারেশন লক হয়, তাই অনেক উত্পাদক / গ্রাহকের সাথে পরিস্থিতিগুলিতে অপারেশনটি ধীর হতে পারে।

ConcurrentLinkedQueueলক ব্যবহার করছে না, কিন্তু সিএএস , তার প্রয়োগ / গ্রহণের অপারেশনগুলিতে অনেকগুলি উত্পাদক এবং গ্রাহক থ্রেডের সাথে ঝুঁকি হ্রাস করে। তবে "ওয়েট ফ্রি" ডেটা স্ট্রাকচার ConcurrentLinkedQueueহওয়ায় খালি থাকলে তা আটকাবে না, অর্থাত্ গ্রাহককে "ব্যস্ত ওয়েটিং" দ্বারা take()প্রত্যাবর্তন nullমূল্যের সাথে মোকাবিলা করতে হবে , উদাহরণস্বরূপ, ভোক্তা থ্রেডটি সিপিইউ খেয়ে ফেলবে।

কোনটি "ভাল" সেগুলি গ্রাহক থ্রেডের সংখ্যার উপর নির্ভর করে, তারা যে পরিমাণ গ্রাহ্য করে / উত্পাদন করে ইত্যাদি each প্রতিটি দৃশ্যের জন্য একটি মানদণ্ডের প্রয়োজন।

একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে যেখানে ConcurrentLinkedQueueস্পষ্টতই ভাল তা হ'ল উত্পাদকরা যখন প্রথমে কিছু উত্পাদন করে এবং কাজটিকে কাতারে রেখে তাদের কাজ শেষ করে এবং গ্রাহকরা গ্রাহকরা আরম্ভ করার পরেই জানেন যে সারিটি খালি থাকলে তারা করা হবে they (এখানে উত্পাদক-ভোক্তার মধ্যে কোনও চুক্তি নেই তবে কেবল নির্মাতা-উত্পাদক এবং ভোক্তা-ভোক্তার মধ্যে)


একটি সন্দেহ এখানে। যেমনটি আপনি উল্লেখ করেছেন ভোক্তা যখন সারিটি খালি থাকে তখন অপেক্ষা করে ... কতক্ষণ এটি অপেক্ষা করে। অপেক্ষা না করার জন্য কে এটি অবহিত করবে?
ব্রিনাল

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

ঠিক আছে, তবে যদি unbounded blockingqueueএটি ব্যবহার করা হয় তবে এটি সিএএস ভিত্তিক ConcurrentLinkedQueue
যুগ্মের

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

আসলে, আমি "গ্রাহক / উত্পাদনের হার" অংশে খুব আগ্রহী, তাই হার বেশি হলে কোনটি ভাল?
workplaylifecycle

0

আরেকটি সমাধান (এটি ভাল স্কেল করে না) হ'ল উপস্থাপনযোগ্য চ্যানেলগুলি: java.util.concurrent SyncronousQueue


0

যদি আপনার সারিটি প্রসারণযোগ্য নয় এবং কেবলমাত্র একটি উত্পাদক / গ্রাহক থ্রেড রয়েছে। আপনি লকলেস সারি ব্যবহার করতে পারেন (আপনাকে ডেটা অ্যাক্সেস লক করতে হবে না)।

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