জাভাতে আমার কোন সমবর্তী সারির প্রয়োগটি ব্যবহার করা উচিত?


132

জাভাডক্স থেকে:

আমার 2 টি পরিস্থিতি রয়েছে, এক গ্রাহকের সাথে একাধিক প্রযোজককে (এটি ব্যবহার করে থ্রেড) সমর্থন করার জন্য একটি সারির প্রয়োজন এবং অন্যটি অন্য পথে।

কোন প্রয়োগটি ব্যবহার করব তা আমি বুঝতে পারি না। কেউ পার্থক্য কি তা ব্যাখ্যা করতে পারেন?

এছাড়াও, এর মধ্যে 'alচ্ছিক ন্যায্যতা নীতি' ArrayBlockingQueueকী?


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

উত্তর:


53

মূলত তাদের মধ্যে পার্থক্য হ'ল পারফরম্যান্স বৈশিষ্ট্য এবং অবরুদ্ধ আচরণ।

প্রথমে সবচেয়ে সহজ গ্রহণ করা ArrayBlockingQueue, একটি স্থির আকারের একটি সারি। সুতরাং আপনি যদি আকারটি 10 ​​এ সেট করেন এবং 11 তম উপাদানটি সন্নিবেশ করানোর চেষ্টা করেন, অন্য থ্রেড কোনও উপাদান অপসারণ না করা অবধি সন্নিবেশ বিবৃতিটি অবরুদ্ধ হবে। ন্যায্যতার বিষয়টি হ'ল যদি একাধিক থ্রেড একই সাথে সন্নিবেশ করা এবং সরানোর চেষ্টা করে (অন্য কথায় কুই ব্লক করা ছিল এমন সময়কালে)। একটি ন্যায্যতা অ্যালগরিদম নিশ্চিত করে যে প্রথম থ্রেড যা জিজ্ঞাসা করে তা প্রথম থ্রেড হয়। অন্যথায়, একটি প্রদত্ত থ্রেড অন্যান্য থ্রেডের চেয়ে বেশি সময় অপেক্ষা করতে পারে, যার ফলে অপ্রত্যাশিত আচরণ ঘটে (কখনও কখনও একটি থ্রেড কেবল কয়েক সেকেন্ড সময় নেয় কারণ পরে শুরু হওয়া অন্যান্য থ্রেডগুলি প্রথমে প্রক্রিয়াজাত হয়)। ট্রেড অফটি হ'ল থ্রুপুটটি ধীর করে ফর্সাতা পরিচালনা করতে ওভারহেড লাগে।

LinkedBlockingQueueএবং এর মধ্যে সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি ConcurrentLinkedQueueহ'ল যদি আপনি একটি থেকে কোনও উপাদানটির জন্য অনুরোধ করেন LinkedBlockingQueueএবং সারিটি খালি থাকে, আপনার থ্রেড সেখানে কিছু না আসা পর্যন্ত অপেক্ষা করবে। একজন ConcurrentLinkedQueueএকটি খালি কিউ আচরণ সঙ্গে সরাসরি ফিরে আসবে।

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


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

123

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

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

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

কোনটি ব্যবহার করবেন তা নির্ভর করে। আমি কনকেন্যরলিঙ্কড কিউ ব্যবহার করার প্রবণতা রাখি কারণ আমার নির্মাতাদের কাতারে রাখার জন্য সময় পেতে সময়টি বিভিন্ন is আমার ঠিক একই মুহুর্তে প্রযোজক প্রচুর নেই। তবে ভোক্তা পক্ষ আরও জটিল কারণ পোল একটি সুন্দর ঘুমের রাজ্যে যাবে না। আপনি নিজেই এটি পরিচালনা করতে হবে।


1
এবং কোন অবস্থার অধীনে অ্যারেব্লকিংকুই লিংকডব্লকিংকুইয়ের চেয়ে ভাল?
kolobok

@ ক্যাপেলকো অ্যারেব্লকিংকিউ আরও সূক্ষ্ম অর্ডার দেওয়ার জন্য অনুমতি দেয়।
ইগোরগানাপলস্কি

2
এর অর্থ কী - "এটি চারদিকে ঘুরবে এবং আবার চেষ্টা করবে।" ?
লেস্টার

9

আপনার প্রশ্নের শিরোনামে ব্লক করা সারিগুলি উল্লেখ করা হয়েছে। যাইহোক, ConcurrentLinkedQueueহয় না একটি অবরোধ কিউ।

BlockingQueueগুলি হয় ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, এবং SynchronousQueue

এর মধ্যে কিছু পরিষ্কারভাবে আপনার কাজের জন্য উপযুক্ত নয় ( DelayQueue, PriorityBlockingQueue, এবং SynchronousQueue)। LinkedBlockingQueueএবং LinkedBlockingDequeঅভিন্ন, পরে যেটি একটি দ্বৈত-সমাপ্ত ক্যু (এটি ডেক ইন্টারফেস প্রয়োগ করে) ব্যতীত।

যেহেতু ArrayBlockingQueueকেবলমাত্র কার্যকর যদি আপনি উপাদানগুলির সংখ্যা সীমাবদ্ধ করতে চান তবে আমি দৃ stick় থাকব LinkedBlockingQueue


আমি শিরোনাম থেকে ব্লকিং শব্দটি সরিয়েছি, ধন্যবাদ। আমি এটি পেয়েছি কিনা তা আমাকে দেখতে দিন, আপনি যা বলেছিলেন তার অর্থ লিন্ডড ব্লকিংকুই একাধিক গ্রাহক / একই বস্তুর উপরে পরিস্থিতি তৈরি করতে ব্যবহার করা যেতে পারে?
ডেভিড হাফম্যান

1
আমি ভেবেছিলাম যে অ্যারেব্লকিংকুইউ আরও সুক্ষ্ম শস্যের থ্রেডগুলিকে ক্রম করতে দেয়? সুতরাং এটির সুবিধা
ইগোরগানাপলস্কি

4

অ্যারেব্লকিংকিউতে কম মেমরির পদচিহ্ন রয়েছে, এটি এলিমেন্ট নোডটি পুনরায় ব্যবহার করতে পারে, লিংকড ব্লকিংকুইয়ের মতো নয় যা প্রতিটি নতুন সন্নিবেশের জন্য একটি লিংকড ব্লকিংকুই $ নোড অবজেক্ট তৈরি করতে হবে।


1
ভাল যুক্তি! আমি লিংকডব্লকিংকুইয়ের চেয়ে অ্যারে ব্লকিং কিউয়ে বেশি পছন্দ করি
ট্রিলিয়নরা

2
এটি অগত্যা সত্য নয় - যদি আপনার সারিটি প্রচুর সময় শূন্যের কাছাকাছি থাকে তবে বড় আকার ধারণ করতে সক্ষম হওয়া প্রয়োজন হয় তবে ArrayBlockingQueueতার স্মৃতিচারণের আরও খারাপ চিহ্ন থাকবে - পুরোপুরি স্মৃতিতে এটি এখনও একটি বড় অ্যারে বরাদ্দ করেছে, যখন LinkedBlockingQueueযখন ঘনিষ্ঠ খালি করতে একটি তুচ্ছ মেমরির পদাঙ্ক থাকবে।
ক্রিস করুন

1
  1. SynchronousQueue(অন্য প্রশ্ন থেকে নেওয়া )

SynchronousQueueহ্যান্ডঅফ বেশি, যেখানে LinkedBlockingQueueকেবলমাত্র একটি একক উপাদানকে অনুমতি দেয়। পার্থক্য হ'ল সংশ্লিষ্ট কল না আসা পর্যন্ত put()কলটিতে কল SynchronousQueueফিরে আসবে না take(), তবে LinkedBlockingQueueআকার 1 এর সাথে put()কলটি (খালি সারিতে) তত্ক্ষণাত্ ফিরে আসবে। এটি মূলত BlockingQueueবাস্তবায়ন যখন আপনি সত্যিকার অর্থে কোনও সারি চান না (আপনি কোনও মুলতুবি থাকা ডেটা বজায় রাখতে চান না)।

  1. LinkedBlockingQueue( LinkedListবাস্তবায়ন তবে ঠিক জেডিকে বাস্তবায়ন LinkedListএটি উপাদানগুলির মধ্যে লিঙ্ক বজায় রাখতে স্থির অভ্যন্তর শ্রেণি নোড ব্যবহার করে)

লিঙ্কডব্লকিংকুইয়ের জন্য নির্মাতা

public LinkedBlockingQueue(int capacity) 
{
        if (capacity < = 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node< E >(null);   // Maintains a underlying linkedlist. ( Use when size is not known )
}

নোড ক্লাস লিঙ্কগুলি বজায় রাখার জন্য ব্যবহৃত হয়

static class Node<E> {
    E item;
    Node<E> next;
    Node(E x) { item = x; }
}

ঘ। অ্যারেব্লকিংকিউ (অ্যারে বাস্তবায়ন)

অ্যারেব্লকিংকুইয়ের জন্য নির্মাতা

public ArrayBlockingQueue(int capacity, boolean fair) 
{
            if (capacity < = 0)
                throw new IllegalArgumentException();
            this.items = new Object[capacity]; // Maintains a underlying array
            lock = new ReentrantLock(fair);
            notEmpty = lock.newCondition();
            notFull =  lock.newCondition();
}

আইএমএইচও এর মধ্যে সবচেয়ে বড় পার্থক্য রয়েছে ArrayBlockingQueueএবং LinkedBlockingQueueএটি নির্মাতাদের থেকে পরিষ্কার যে অন্তর্নিহিত ডেটা স্ট্রাকচার অ্যারে এবং অন্যান্য লিঙ্কযুক্ত তালিকা রয়েছে

ArrayBlockingQueueব্যবহার একক-লক ডবল শর্ত অ্যালগরিদম এবং LinkedBlockingQueue"দুই লক কিউ" আলগোরিদিম বৈকল্পিক হয় এবং এটি 2 কেশ 2 শর্ত (takeLock, putLock) আছে


0

সাম্প্রতিক লিঙ্কযুক্ত কিউউ লক-মুক্ত, লিংকডব্লকিংকুই নয়। প্রতিবার আপনি লিঙ্কডব্লকিংকুই.পুট () বা লিংকডব্লকিংকিউ.ইটেক.) গ্রহণ করুন, আপনাকে প্রথমে লকটি অর্জন করতে হবে। অন্য কথায়, লিংকডব্লকিংকুইয়ের সামঞ্জস্য নেই। আপনি যদি পারফরম্যান্সের যত্ন নেন তবে কনক্রেন্টলিঙ্কডকুইউ + লকসপোর্ট চেষ্টা করুন।

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