জাভার জেডিকে একটি সমবর্তী তালিকা আছে?


277

আমি কীভাবে সামঞ্জস্যপূর্ণ তালিকার উদাহরণ তৈরি করতে পারি, যেখানে আমি সূচী দ্বারা উপাদানগুলি অ্যাক্সেস করতে পারি? আমি ব্যবহার করতে পারি এমন কোন ক্লাস বা কারখানার পদ্ধতি কি জেডিকে রয়েছে?


28
গঠনমূলক নয় কেন? বেশ কয়েকটি প্রস্তাবিত অনুলিপি অনুলিপিআরআইলিস্ট যা নেট। তে পাওয়া যায় না। আপনি বলতে পারেন যে উভয় প্রশ্নই একে অপরের সাথে সম্পর্কিত তবে এটি বন্ধ করার জন্য নয় !!!
অ্যালিক্লিজিন-কিলাকা

1
আমার ধারণা নেই কেন জারোদ রবারসন স্টিফেনের তৈরি বিশদ সম্পাদনাগুলি গ্রহণ করে এবং সেগুলি মূল, দুর্বল-দ্বিগুণ প্রশ্নে ফিরিয়ে দেওয়া ভাল ধারণা বলে মনে করবে। জারোদের উত্তর এখনও পুরোপুরি গ্রহণযোগ্য। প্রকৃতপক্ষে, কপিঅনউইরাইটআরলিলিস্ট হ'ল জেডিকে একমাত্র সমবর্তী শ্রেণি প্রয়োগকারী তালিকা। বিস্মিত ...
ম্যাট প্যাসেল 14

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

1
/ locked/ closed/ পূর্ববর্তী মন্তব্য

8
এই প্রশ্নটি বন্ধ হওয়ার কোনও কারণ নেই। এটি জেডিকে ক্লাস সম্পর্কে জিজ্ঞাসা করে, যা গ্রন্থাগারের সন্ধানের মতো কিছুই নয়; এটি জাভা বেস।
মার্টিনাস

উত্তর:


175

Java.util.concurrent এ একযোগে তালিকার প্রয়োগ রয়েছে । বিশেষ করে কপিরাইটঅনরাইটআরলিলিস্ট


84
নোট করুন এটি প্রতিটি inোকাতে পুরো তালিকাটি অনুলিপি করে, তাই এটি প্রায়শই অক্ষম থাকে।
dfrankow

22
@ ডিফ্র্যাঙ্কো তবে আপনি আপডেট করার চেয়ে অনেক বেশি পুনরাবৃত্তি করলে এটি আরও কার্যকর হতে পারে ।
b1nary.atr0phy

এখানে প্রদর্শিত হিসাবে ভাল কাজ করে না। যদিও আমি কেবলমাত্র এর অ্যাডএল পদ্ধতি ব্যবহার করি এবং স্ট্রিমটি ব্যবহার করে এটি পড়েছি তারপরেও আমার ব্যতিক্রম রয়েছে। stackoverflow.com/questions/1527519/...
devssh

166

যদি আপনি সূচক ভিত্তিক অ্যাক্সেস সম্পর্কে চিন্তা করেন না এবং কেবল একটি তালিকার সন্নিবেশ-ক্রম-সংরক্ষণ বৈশিষ্ট্যগুলি চান তবে আপনি java.util.concurrent.ConcurrentLinkedQueue বিবেচনা করতে পারেন । যেহেতু এটি পরিবেশনযোগ্যকে কার্যকর করে, একবার আপনি সমস্ত আইটেম যুক্ত করা শেষ করে, সিনট্যাক্সের জন্য বর্ধিত ব্যবহার করে সামগ্রীগুলি লুপ করতে পারেন:

Queue<String> globalQueue = new ConcurrentLinkedQueue<String>();

//Multiple threads can safely call globalQueue.add()...

for (String href : globalQueue) {
    //do something with href
}

4
আমি মনে করি যে বিবৃতি ( :) এর সরলীকরণকে ফোরচ
AlikElzin-kilaka

2
@ অ্যালিকেলজিন-কিলাকা ঠিক বলেছেন। আমি মনে করি যে সেই নামটি আমাকে সর্বদা বিরক্ত করেছে, কারণ প্রকৃত বাক্য গঠনে "প্রতিটি" শব্দটি অন্তর্ভুক্ত নয়, তবে আমি অফিসিয়াল নামটি ব্যবহার করার জন্য উত্তরটি আপডেট করব। :)
ম্যাট প্যাসেল

3
@ অ্যালিক্লিজিন-কিলাকা নিতপিকিং, তবে জেএলএস সংস্করণ 8 অনুসারে এটিকে "বিবৃতি দেওয়ার জন্য বর্ধিত" বলা হয়। জাভা টিউটোরিয়ালে একই ।
রোল্যান্ড

1
@ রোল্যান্ড অবশ্যই নিটপিক করছে না। জাভাতে "প্রত্যেকের জন্য" এবং "বর্ধিত" এর মধ্যে একটি পার্থক্য রয়েছে (এখন)।
hfontanez

2
@ রোল্যান্ড অপ্রত্যক্ষভাবে। আমি বিশ্বাস করি যে তারা স্ট্রিম.এফ.এচ এবং এখন যা বর্ধিত হিসাবে পরিচিত, তার মধ্যে বিভ্রান্তি দূর করতে "প্রতিটি লুপের জন্য" "উন্নত" নামকরণ করেছিলেন।
hfontanez

128

আপনার খুব প্রয়োজন যদি সাধারণ অনুরোধের সিঙ্ক্রোনাইজেশন হয় তবে আপনি খুব ভাল সংগ্রহের সংকলন তালিকা (তালিকা) ব্যবহার করতে পারেন :

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());

70
এর ফলাফল synchronizedList"সিঙ্ক্রোনাইজড" তবে "সমবর্তী" নয়। একটি মৌলিক বিষয় যা বহু তালিকার ক্রিয়াকলাপগুলি - যা সূচক-ভিত্তিক - সেগুলি নিজেরাই পারমাণবিক নয় এবং বৃহত্তর পারস্পরিক বর্জনীয় গঠনের অংশ হতে হবে।

6
আইএমও, একটি asing Vectorবদলে আরো সহজবোধ্য Collections.synchronizedList(new ArrayList<Object>())
স্টিফান

8
সিঙ্ক্রোনাইজডলিস্টের ফলাফলটি "সিঙ্ক্রোনাইজড" তবে "সমবর্তী" নয়।
Kanagavelu Sugumar

46

কারণ অবস্থান অর্জনের এবং প্রদত্ত অবস্থান থেকে উপাদানটি অর্জনের কাজটি স্বাভাবিকভাবেই কিছু লকিংয়ের প্রয়োজন (আপনার তালিকায় এই দুটি অপারেশনের মধ্যে কাঠামোগত পরিবর্তন থাকতে পারে না)।

একযোগে সংগ্রহের খুব ধারণাটি হ'ল প্রতিটি কাজ নিজেই পারমাণবিক এবং সুস্পষ্ট লকিং / সিঙ্ক্রোনাইজেশন ছাড়াই করা যেতে পারে।

সুতরাং পারমাণবিক ক্রিয়াকলাপ হিসাবে nপ্রদত্ত থেকে উপাদানটিতে অবস্থান পাওয়া Listএমন পরিস্থিতিতে খুব একটা বোঝায় না যেখানে একত্রে অ্যাক্সেসের প্রত্যাশা রয়েছে।


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

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

13

আপনার এই বিকল্পগুলি রয়েছে:

  • Collections.synchronizedList(): যদি আপনার কোন মোড়ানো পারেন Listবাস্তবায়ন ( ArrayList, LinkedListবা 3 য় পক্ষের তালিকা)। প্রতিটি পদ্ধতির অ্যাক্সেস (পড়া এবং লেখা) ব্যবহার করে সুরক্ষিত থাকবে synchronizediterator()লুপের জন্য ব্যবহার বা বর্ধিত করার সময় আপনাকে ম্যানুয়ালি সিঙ্ক্রোনাইজ করতে হবে; পুনরাবৃত্তি করার সময়, অন্যান্য থ্রেড এমনকি পড়া থেকে সম্পূর্ণ অবরুদ্ধ। আপনি প্রতিটি hasNextএবং nextকলের জন্য পৃথকভাবে সিঙ্ক্রোনাইজ করতে পারেন তবে ConcurrentModificationExceptionতা সম্ভব।

  • CopyOnWriteArrayList: এটি পরিবর্তন করা ব্যয়বহুল, তবে পড়ার জন্য অপেক্ষা মুক্ত। আইট্রেটাররা কখনই ফেলে না ConcurrentModificationException, পুনরাবৃত্তির সময় তালিকার অন্য থ্রেড দ্বারা সংশোধন করা হলেও পুনরুক্তি তৈরির মুহুর্তে তারা তালিকার একটি স্ন্যাপশট ফিরিয়ে দেয়। প্রায়শই আপডেট হওয়া তালিকার জন্য দরকারী। addAllআপডেটের জন্য বেশিরভাগ অপারেশন পছন্দ করা হয় - অভ্যন্তরীণ অ্যারেটি অনেক বার অনুলিপি করা হয়।

  • Vector: খুব বেশি পছন্দ synchronizedList, তবে পুনরাবৃত্তিটিও সিঙ্ক্রোনাইজ করা হয়। যাইহোক, পুনরুক্তি ConcurrentModificationExceptionকরার সময় ভেক্টর অন্য থ্রেড দ্বারা সংশোধন করা হলে, নিক্ষেপ করতে পারে ।

অন্যান্য অপশন:

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

4

এখানে চিত্র বর্ণনা লিখুন

কপিরআনওরাইটআরলিলিস্ট অ্যারেলিস্টের একটি থ্রেড-সেফ বৈকল্পিক যেখানে অন্তর্নিহিত অ্যারের একটি নতুন অনুলিপি তৈরি করে সমস্ত মিউটেশন অপারেশন (যুক্ত, সেট, এবং তাই) প্রয়োগ করা হয়।

কপিঅনওয়ারাইটআরলিলিস্ট সিঙ্ক্রোনাইজড লিস্ট প্রয়োগের তালিকার ইন্টারফেস এবং java.util.concurrent প্যাকেজের অংশ এবং এটির থ্রেড-নিরাপদ সংগ্রহের সমকালীন বিকল্প।

public class CopyOnWriteArrayList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

অনুলিপি করার সময় অনুলিপি করা অনুলিপি করার সময় কপিরআনরাইটআরলিলিস্টটি ব্যর্থ-নিরাপদ এবং কনকন্টারমোডিফিকেশন এক্সেক্সশনটি নিক্ষেপ করে না যখন অ্যারেলিস্টের পৃথক অনুলিপি ব্যবহার করুন।

এটি সাধারণভাবে খুব ব্যয়বহুল কারণ প্রতি আপডেট ক্রিয়াকলাপে জড়িত অনুলিপি একটি ক্লোনড অনুলিপি তৈরি করা হবে। কপিরাইটঅনরাইটআরলিলিস্ট কেবল ঘন ঘন পঠন অপারেশনের জন্য সেরা পছন্দ।

/**
         * Returns a shallow copy of this list.  (The elements themselves
         * are not copied.)
         *
         * @return a clone of this list
         */
        public Object clone() {
            try {
                @SuppressWarnings("unchecked")
                CopyOnWriteArrayList<E> clone =
                    (CopyOnWriteArrayList<E>) super.clone();
                clone.resetLock();
                return clone;
            } catch (CloneNotSupportedException e) {
                // this shouldn't happen, since we are Cloneable
                throw new InternalError();
            }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.