জাভাতে সেরা সমঝোতা তালিকা নির্বাচন করা [বন্ধ]


99

আমার থ্রেড পুলটিতে একটি নির্দিষ্ট সংখ্যক থ্রেড রয়েছে। এই থ্রেডগুলি প্রায়শই একটি ভাগ করা তালিকা থেকে লিখতে এবং পড়তে হবে

সুতরাং, java.util.concurrentপ্যাকেজের কোন ডেটা স্ট্রাকচার (এটি আরও ভাল একটি তালিকা হওয়া উচিত, অবশ্যই মনিটর-মুক্ত থাকতে হবে) এই ক্ষেত্রে সেরা?


5
এটি সংগ্রহের সাথে আপনি কী করতে চান তা নির্ভর করে। দেখুন আমার ব্লগ পোস্ট (যদিও এটা নেট সম্বন্ধে, ধারণাসমূহ একই)। আপনি একটি দিয়ে সঠিক থ্রেড-নিরাপদ কোড লিখতে সক্ষম হওয়ার সম্ভাবনা নেই List
এসএলএক্স

4
এখন আমি ব্যবহার করছি CopyOnWriteArrayList কিন্তু ConcurrentModificationException ব্যতিক্রম এখনো মাঝে মাঝে ফেলে দেওয়া হয়।
嘉 道

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

4
ConcurrentModificationExceptionএকটি সমন্বয়সাধন সমস্যা থেকে আসে পারে; এটি সংগ্রহের ওপরে লুপে উদাহরণস্বরূপ উঠে আসে যেখানে আপনি সংগ্রহ থেকে কোনও উপাদান সরিয়ে দেওয়ার চেষ্টা করেন।
টোটো 2

4
আমি জানি এটি প্যাকেজের অংশ নয়, তবে কেউ চেষ্টা করেছেন Vector?
ওয়েস্টার্নগুন

উত্তর:


98

ভাল ছিল List

এর মধ্যে কেবলমাত্র List বাস্তবায়ন java.util.concurrentহ'ল কপিরআনরাইটআরলিলিস্ট । ট্র্যাভিস ওয়েব উল্লেখ করার সাথে সাথে একটি সিঙ্ক্রোনাইজড তালিকার বিকল্পও রয়েছে।

এই বলেছিল, আপনি কি নিশ্চিত যে এটি হওয়ার দরকার আছে List? সমবর্তী Queueএস এবং এসগুলির জন্য আরও অনেক বিকল্প রয়েছে Map(এবং আপনি গুলিগুলি এস Setথেকে তৈরি করতে পারেন Map) এবং এই কাঠামোগুলি আপনি ভাগ করে নেওয়া ডেটা কাঠামোয় যে ধরণের জিনিস করতে চান তার অনেক ধরণের জন্য সার্থকতা তৈরি করে।

সারিগুলির জন্য, আপনার কাছে বিপুল সংখ্যক বিকল্প রয়েছে এবং কোনটি আপনি এটি কীভাবে ব্যবহার করবেন তা নির্ভর করে:


14
CopyOnWriteArrayListলেখায় খুব ব্যয়বহুল হওয়ার অসুবিধা রয়েছে (তবে পড়ার জন্য সস্তা) আপনি যদি প্রচুর লেখালেখি করে থাকেন তবে আপনি একটি সিঙ্ক্রোনাইজড তালিকা বা একটি সারি সহ আরও ভাল।
পিটার লরি

69

যে কোনও জাভা সংগ্রহকে থ্রেড-সেফ হিসাবে তৈরি করা যেতে পারে:

List newList = Collections.synchronizedList(oldList);

অথবা একটি নতুন থ্রেড-নিরাপদ তালিকা তৈরি করতে:

List newList = Collections.synchronizedList(new ArrayList());

http://download.oracle.com/javase/6/docs/api/java/util/ Collections.html#synchronizedList(java.util.List)


7
এই কারণে, আপনি java.util.concurrent - উহম-তে কোনও তালিকা প্রয়োগের সন্ধান পাবেন না , ConcurrentHashMapযদিও সেখানে একটি Collections.synchronizedMapপদ্ধতি রয়েছে।
আইয়ুব

7
জাভাদোকগুলি চালু করুন ConcurrentHashMap। সিঙ্ক্রোনাইজেশন বাস্তবায়নের বিশদ আলাদা। মূলত synchronizedপদ্ধতিগুলি ব্যবহার করে Collectionsএকটি জাভা মনিটরে ক্লাসটি গুটিয়ে রাখে। ConcurrentHashMapআরও চতুর সম্মতিযুক্ত বৈশিষ্ট্য ব্যবহার করে।
ট্র্যাভিস ওয়েব

4
হ্যাঁ তবুও এটি আপনার শেষ বাক্যটিকে বাছাই করে অবৈধ করে তোলে।
আইয়ুব

4
যদি কোনও মনিটর ব্যবহার করে তবে প্রোগ্রামটির কার্য
সম্পাদনটি

6
কেবল যোগ করতে, নতুন তালিকাতে পুনরাবৃত্তি থ্রেড নিরাপদ নয়। !!
bluelurker

9

যদি তালিকাটির আকার ঠিক করা থাকে তবে আপনি একটি অ্যাটমিক রেফারেন্সআরে ব্যবহার করতে পারেন । এটি আপনাকে একটি স্লটে সূচিযুক্ত আপডেটগুলি সম্পাদন করতে দেয়। প্রয়োজনে আপনি একটি লিস্ট ভিউ লিখতে পারেন।


6

আপনি পল মার্টিনের "একটি প্রাকটিক্যাল লক-ফ্রি ডাবলি-লিঙ্কড লিস্ট" এর উপর ভিত্তি করে ডগ লি দ্বারা রচিত কনকন্টারডুবল্লিলিঙ্কলিস্টটি দেখতে চাইতে পারেন । এটি java.util.List ইন্টারফেস বাস্তবায়িত করে না, তবে বেশিরভাগ পদ্ধতি আপনি তালিকাতে ব্যবহার করবেন।

জাভাডোকের মতে:

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


5

ConcurrentLinkedQueueএকটি লক-মুক্ত কাতার ব্যবহার করে (নতুন সিএএস নির্দেশাবলীর ভিত্তিতে )।


7
... যা Listইন্টারফেস প্রয়োগ করে না ।
আইয়ুব

4
ই এসনিফ, আপনি কীভাবে List.set(int index, Object element)সমকালীন লিঙ্কযুক্ত কিউ দিয়ে বাস্তবায়ন করবেন?
জন ভিন্ট

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

4
@ কলিনড যে উত্তরটি আমি যাচ্ছিলাম তা সিএলকিউ কেন একটি তালিকায় মোড়া না যায় তার বেশ কয়েকটি কারণ রয়েছে। যদিও আমি সম্মত, কুই ইন্টারফেসটি বাতিল করতে পারবেন না।
জন ভিন্ট

4
Not লক্ষণীয় যে: "
বেহরং সাইদজাদেহ

3

যদি সেটটি পর্যাপ্ত হয় তবে কনক্র্যান্টস্কিপলিস্টসেট ব্যবহার করা যেতে পারে। (এর বাস্তবায়ন কনকরেন্টসস্কিপলিস্টম্যাপের উপর ভিত্তি করে যা একটি এড়িয়ে যাওয়ার তালিকা কার্যকর করে ))

প্রত্যাশিত গড় সময় ব্যয় হ'ল লগ (এন) এর মধ্যে অপারেশনগুলি অন্তর্ভুক্ত, যুক্ত করা এবং অপসারণ; আকার পদ্ধতিটি একটি ধ্রুবক-সময় অপারেশন নয়।

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