কনক্র্যান্টহ্যাশম্যাপ এবং কালেকশনস.সিঙ্ক্রোনাইজড ম্যাপ (মানচিত্র) এর মধ্যে পার্থক্য কী?


607

আমার কাছে একটি মানচিত্র রয়েছে যা এক সাথে বেশ কয়েকটি থ্রেড দ্বারা সংশোধন করতে হবে।

জাভা এপিআইতে তিনটি পৃথক সিঙ্ক্রোনাইজ করা মানচিত্র প্রয়োগ রয়েছে বলে মনে হচ্ছে:

  • Hashtable
  • Collections.synchronizedMap(Map)
  • ConcurrentHashMap

আমি যা বুঝতে পেরেছি তা Hashtableহ'ল একটি পুরানো বাস্তবায়ন (অপ্রচলিত Dictionaryশ্রেণি প্রসারিত করা ), যা পরে Mapইন্টারফেসের সাথে মানানসই রূপান্তরিত হয়েছিল । যদিও এটা করা হয় সিঙ্ক্রোনাইজ, এটা গুরুতর আছে বলে মনে হয় কর্মক্ষমতা প্রসারণ সমস্যা এবং নতুন প্রকল্পগুলির জন্য নিরুৎসাহিত করা হয়।

তবে অন্য দুজনের কী হবে? মানচিত্র Collections.synchronizedMap(Map)এবং ConcurrentHashMapএর দ্বারা ফিরে আসা মধ্যে পার্থক্য কি ? কোনটি কোন পরিস্থিতিতে ফিট করে?


7
@ স্মাইলসিনা জার লিংকটি বর্তমানে ভেঙে গেছে, এখানে এই নিবন্ধটির একটি আর্কাইভ কপি দেওয়া হয়েছে: কেন কনক্র্যান্ট হ্যাশম্যাপ হ্যাশটেবলের চেয়ে ভাল এবং হ্যাশম্যাপের মতোই ভাল
তথ্যসূত্র


এফওয়াইআই, জাভা 6 ConcurrentSkipListMapঅন্য থ্রেড-নিরাপদ Mapবাস্তবায়ন হিসাবে আনা হয়েছে। স্কিপ তালিকার অ্যালগোরিদম ব্যবহার করে লোডের অধীনে অত্যন্ত সমকালীন হিসাবে নকশাকৃত।
বেসিল Bourque

উত্তর:


423

আপনার প্রয়োজনের জন্য, ব্যবহার করুন ConcurrentHashMap। এটি মানচিত্রকে ব্লক না করে বিভিন্ন থ্রেডের একযোগে পরিবর্তনের অনুমতি দেয়। Collections.synchronizedMap(map)অবিচ্ছিন্ন মানচিত্র তৈরি করে যা কার্যকারিতা হ্রাস করবে, যদিও এটি ধারাবাহিকতা নিশ্চিত করে (যদি সঠিকভাবে ব্যবহৃত হয়)।

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


8
উত্স কোডের দিকে তাকালে, সিঙ্ক্রোনাইজ করা মানচিত্রটি কেবলমাত্র একটি মুটেক্স (ব্লকিং) সহ একটি বাস্তবায়ন যখন
কনকন্টার্যান্স হ্যাশম্যাপ

123
দয়া করে নোট করুন যে সমবর্তী হ্যাশম্যাপটি নাল কী বা মানকে অনুমতি দেয় না। সুতরাং তারা কোনও সিঙ্ক্রোনাইজ করা মানচিত্রের সমান বিকল্প নয়।
onejigtwojig

24
আমি মনে করি আপনার এটি পড়তে হবে http://ria101.wordpress.com/2011/12/12/concurrenthashmap-avoid-a-common-misuse/
মিঃ স্পার্ক

5
@ আবদুল্লাহশাইখ এই নিবন্ধে উত্থাপিত বিষয়টি জাভা 7-এ স্থির করা হয়েছে এবং জাভা ৮-তে আরও উন্নতি করা হয়েছে
পালস0

5
@ চেঞ্জিন: আপনি যখন মানচিত্রের একাধিক প্রশ্ন বা আপডেট নিয়ে একটি অপারেশন করছেন বা মানচিত্রে পুনরাবৃত্তি করছেন তখন অবিচ্ছিন্নতা নিশ্চিত করতে আপনাকে মানচিত্রে ম্যানুয়ালি সিঙ্ক্রোনাইজ করতে হবে। সিঙ্ক্রোনাইজ করা মানচিত্রগুলি মানচিত্রে কেবলমাত্র একক ক্রিয়াকলাপ (পদ্ধতি আহ্বান) এর জন্য ধারাবাহিকতার গ্যারান্টি দেয়, যা এটি প্রায়শই অকেজো হয়ে যায় কারণ বেশিরভাগ বাস্তব জীবনের ক্রিয়াকলাপগুলি তুচ্ছ নয় সুতরাং আপনাকে ম্যানুয়ালি যে কোনওভাবে সিঙ্ক্রোনাইজ করতে হবে।
হলগার

241
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
║   Property    ║     HashMap       ║    Hashtable      ║  ConcurrentHashMap  ║
╠═══════════════╬═══════════════════╬═══════════════════╩═════════════════════╣ 
║      Null     ║     allowed       ║              not allowed                ║
║  values/keys  ║                   ║                                         ║
╠═══════════════╬═══════════════════╬═════════════════════════════════════════╣
║ Thread-safety ║                   ║                                         ║
║   features    ║       no          ║                  yes                    ║
╠═══════════════╬═══════════════════╬═══════════════════╦═════════════════════╣
║     Lock      ║       not         ║ locks the whole   ║ locks the portion   ║        
║  mechanism    ║    applicable     ║       map         ║                     ║ 
╠═══════════════╬═══════════════════╩═══════════════════╬═════════════════════╣
║   Iterator    ║               fail-fast               ║ weakly consistent   ║ 
╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝

লকিং মেকানিজম সম্পর্কিত: Hashtable অবজেক্টটি লক করে , যখন কেবল বালতিটিConcurrentHashMap লক করে


13
Hashtableমানচিত্রের অংশ লক করা হয় না। বাস্তবায়ন দেখুন। এটি synchronizedকোনও লক সরবরাহ না করে কী ব্যবহার করছে যাতে এটির মূলত অর্থ এটি hashtableপ্রতিটি ক্রিয়াকলাপে সম্পূর্ণ লক করে দেয়।
আরমচনিক

6
সিঙ্ক্রোনাইজড ম্যাপ সম্পর্কে কী?
স্যামুয়েল এডউইন ওয়ার্ড

3
কালেকশনস.সিনক্রোনাইজড ম্যাপের আচরণটি ব্যাকিং মানচিত্রের মতো, সমস্ত পদ্ধতি থ্রেড-সেফ ছাড়া
সের্গেই শেভচাইক

5
আমি টেবিলটি মুদ্রণ করব এবং প্রতি 5 ডলারে বিক্রি করব;)। ভাল একটি @ শেভচাইক
রিয়েলপিকে

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

142

এর জন্য "স্কেল্যাবিলিটি ইস্যুগুলি" Hashtableঠিক একইভাবে উপস্থিত রয়েছেCollections.synchronizedMap(Map) - এগুলি খুব সাধারণ সিঙ্ক্রোনাইজেশন ব্যবহার করে, যার অর্থ শুধুমাত্র একই থ্রেড একই সাথে মানচিত্রটিতে অ্যাক্সেস করতে পারে।

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

ConcurrentHashMapব্যবহারসমূহ খুব বাস্তবধর্মী কৌশল সিঙ্ক্রোনাইজেশন প্রয়োজনীয়তা হ্রাস এবং সুসংগতি ছাড়া একাধিক থ্রেড দ্বারা সমান্তরাল পঠিত অ্যাক্সেসের মঞ্জুরি দিতে এবং, সবচেয়ে গুরুত্বপূর্ণভাবে, উপলব্ধ একটি Iteratorকোনো সিঙ্ক্রোনাইজেশন প্রয়োজন এবং এমনকি মানচিত্র (interation সময় পরিবর্তিত হতে পারবেন যদিও এটা কোন গ্যারান্টি কিনা বা তোলে পুনরাবৃত্তির সময় elementsোকানো উপাদানগুলি ফিরে আসবে না)।


4
এখন এটাই আমি চেয়েছিলাম! :) নো-সিঙ্ক্রোনাইজ করা আইট্রেটারটি কেবল খাঁটি মিষ্টি একাই! তথ্যের জন্য থানস্ক! :) (:
কাউনাভি

দুর্দান্ত উত্তর..কিন্তু এর অর্থ এই যে পুনরুদ্ধারের সময় থ্রেড সর্বশেষ আপডেটগুলি পাবে না কারণ পাঠক থ্রেডগুলি সিঙ্কে নেই।
MrA

@ এমআরএ: আপনি কি সমকালীন হ্যাশম্যাপ সম্পর্কে জিজ্ঞাসা করছেন? এবং "পুনরুদ্ধার" বলতে কী বোঝ?
মাইকেল বর্গওয়ার্ট

4
উদাহরণস্বরূপ কনক্র্যান্ট হ্যাশম্যাপের জন্য মিশেল বোর্ওয়ার্ড্ট ধরুন এখানে একাধিক থ্রেড রয়েছে। তাদের মধ্যে কিছু মানচিত্র আপডেট করছে এবং তাদের মধ্যে কেউ একই মানচিত্র থেকে ডেটা পাচ্ছে। এই দৃশ্যে তাই যখন থ্রেডগুলি পড়ার চেষ্টা করা হচ্ছে তখন এটি গ্যারান্টিযুক্ত যে তারা পাঠানো থ্রেডগুলিকে লক ধরে না রাখার কারণে আপডেট হওয়া সর্বশেষতম ডেটা পাবে।
মিঃআ

35

আপনি যখন এটি ব্যবহার করতে পারেন তখন কনকেন্যরহ্যাশম্যাপটি পছন্দনীয় - যদিও এর জন্য কমপক্ষে জাভা 5 প্রয়োজন requires

এটি একাধিক থ্রেড দ্বারা ব্যবহৃত হলে ভাল স্কেল করার জন্য ডিজাইন করা হয়েছে। পারফরম্যান্স প্রান্তিকভাবে দরিদ্র হতে পারে যখন কেবলমাত্র একক থ্রেড একবারে মানচিত্রটিতে অ্যাক্সেস করে তবে একাধিক থ্রেড একই সাথে মানচিত্রে অ্যাক্সেস করতে গেলে উল্লেখযোগ্যভাবে ভাল হয় better

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

কালেকশনস.সিনক্রোনাইজড ম্যাপটি কেবল তখনই অর্থবোধ করে যা আপনার যদি কিছু অন্যান্য বৈশিষ্ট্য, সম্ভবত কোনও ট্রাইম্যাপের মতো কিছু সাজানো মানচিত্রের সাথে মানচিত্রটি গুটিয়ে রাখতে হয়।


2
হ্যাঁ - মনে হয় আমি নিজের তৈরি প্রতিটি উত্তরটিতে সেই বইটির উল্লেখ করেছি!
বিল মিশেল

@ বিলমিচেল লিঙ্কটি নষ্ট হয়েছে

@ গোবিন্দ লিঙ্কটি অ্যাক্সেস করার আগে জাভাস্ক্রিপ্ট বন্ধ করুন। ব্লগ এন্ট্রি এখনও আছে!
বিল মিশেল

32

এই দুটিয়ের মধ্যে প্রধান পার্থক্যটি হ'ল ConcurrentHashMapডেটা কেবলমাত্র সেই অংশটি লক করে দেবে যা আপডেট করা হচ্ছে এবং অন্যান্য অংশের মাধ্যমে তথ্যের অন্যান্য অংশ অ্যাক্সেস করতে পারে। তবে Collections.synchronizedMap()আপডেট করার সময় সমস্ত ডেটা লক করে দেবে, অন্য থ্রেডগুলি কেবলমাত্র লকটি প্রকাশিত হলেই ডেটা অ্যাক্সেস করতে পারে। যদি অনেকগুলি আপডেট অপারেশন এবং অপেক্ষাকৃত স্বল্প পরিমাণে পঠিত অপারেশন থাকে তবে আপনার চয়ন করা উচিতConcurrentHashMap

এছাড়াও অন্য একটি পার্থক্য হ'ল ConcurrentHashMapমানচিত্রে প্রবেশকারী উপাদানগুলির ক্রম সংরক্ষণ করা হবে না HashMapdata তথ্য সংরক্ষণ করার সময় এটির অনুরূপ । উপাদান অর্ডার সংরক্ষণ করা হয় যে কোন গ্যারান্টি নেই। যদিও Collections.synchronizedMap()সংরক্ষণ করবে ম্যাপ উপাদান অনুক্রমে গৃহীত। উদাহরণস্বরূপ, যদি আপনি একটি পাস TreeMapথেকে ConcurrentHashMapউপাদান মধ্যে অর্ডার ConcurrentHashMapএ আদেশ হিসাবে একই নাও হতে পারে TreeMap, কিন্তু Collections.synchronizedMap()অর্ডার সংরক্ষণ করা হবে।

তদতিরিক্ত, ConcurrentHashMapগ্যারান্টি দিতে পারে যে কোনও ConcurrentModificationExceptionথ্রেড মানচিত্র আপডেট করার সময় আর কোনও থ্রেড মানচিত্র থেকে প্রাপ্ত পুনরাবৃত্তিকে অনুসরণ করছে। তবে, Collections.synchronizedMap()এটির কোনও গ্যারান্টি নেই।

এখানে একটি পোস্ট রয়েছে যা এই দুটিয়ের পার্থক্য প্রদর্শন করে এবং এটিও ConcurrentSkipListMap


13

সিঙ্ক্রোনাইজড মানচিত্র:

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

ConcurrentHashMap:

কনক্র্যান্টহ্যাশম্যাপ ক্লাস স্ট্যান্ডার্ড হ্যাশম্যাপের একসাথে সংস্করণ সরবরাহ করে। এটি সংগ্রহে ক্লাসে সরবরাহিত সিঙ্ক্রোনাইজড ম্যাপ কার্যকারিতাটির একটি উন্নতি।

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

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

সাম্প্রতিক হ্যাশম্যাপ একটি সমকালীন মডিডিফিকেশনটি ছুঁড়ে না

যদি কোনও থ্রেড এটির পরিবর্তিত করার চেষ্টা করে যখন অন্যটি এটির উপরে পুনরাবৃত্তি করে তবে কনকন্টার হ্যাশম্যাপ একটি সাম্প্রতিককালের মডেলফিকেশনটি ছুঁড়ে না

সিঙ্কর্নাইজড ম্যাপ এবং কনকন্টারহ্যাশম্যাপের মধ্যে পার্থক্য

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

সমকালীন হ্যাশম্যাপটি নাল কী বা নাল মানগুলিকে মঞ্জুরি দেয় না যখন সিঙ্ক্রোনাইজড হ্যাশম্যাপ একটি নাল কীকে মঞ্জুরি দেয়।

অনুরূপ লিঙ্ক

Link1

Link2

পারফরম্যান্স তুলনা


12
  • Hashtableএবং কী বা মানগুলির ConcurrentHashMapঅনুমতি দেবেন না ।nullnull

  • Collections.synchronizedMap(Map)সিঙ্ক্রোনাইজ সব কার্যকলাপ ( get, put, size, ইত্যাদি)।

  • ConcurrentHashMap পুনরুদ্ধারগুলির সম্পূর্ণ সম্মতি এবং আপডেটগুলির জন্য সামঞ্জস্যযোগ্য প্রত্যাশিত সম্মতি সমর্থন করে।

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


12

ইন ConcurrentHashMap, লকটি পুরো মানচিত্রের পরিবর্তে একটি বিভাগে প্রয়োগ করা হয়। প্রতিটি বিভাগ তার নিজস্ব অভ্যন্তরীণ হ্যাশ টেবিল পরিচালনা করে। লকটি শুধুমাত্র আপডেট অপারেশনের জন্য প্রয়োগ করা হয়। Collections.synchronizedMap(Map)পুরো মানচিত্র সিঙ্ক্রোনাইজ করে।


আপনি কি দয়া করে একবার দেখতে পারেন স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / ৪৪857৯০০০/২ ?
gstackoverflow

9

আপনি ঠিক সম্পর্কে HashTable, আপনি এটি সম্পর্কে ভুলে যেতে পারেন।

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

synchronized (records) {
  Record rec = records.get(id);
  if (rec == null) {
      rec = new Record(id);
      records.put(id, rec);
  }
  return rec;
}

তবে, উপরে যেভাবে দেখানো হয়েছে সাধারণ ব্লক সহ ConcurrentHashMapএটির জন্য এটি সহজ বিকল্প বলে মনে করবেন না । এর নিবিড়তা আরও ভালভাবে বুঝতে এই নিবন্ধটি পড়ুন ।HashMapsynchronized


7

এখানে কয়েকটি দেওয়া হল:

1) সমবর্তী হ্যাশম্যাপ মানচিত্রের কেবলমাত্র অংশ লক করে তবে সিঙ্ক্রোনাইজড ম্যাপ পুরো এমএপি লক করে।
2) সমকালীন হ্যাশম্যাপের সিঙ্ক্রোনাইজড ম্যাপের চেয়ে আরও ভাল পারফরম্যান্স রয়েছে এবং আরও স্কেলযোগ্য।
3) একাধিক পাঠক এবং একক লেখকের ক্ষেত্রে কনকন্টারহ্যাশম্যাপ সেরা পছন্দ।

এই পাঠ্যটি সামঞ্জস্যপূর্ণ হ্যাশম্যাপ এবং জাভাতে হ্যাশটেবলের মধ্যে পার্থক্য থেকে


7

আমরা কনকন্টারহ্যাশম্যাপ এবং সিঙ্ক্রোনাইজড হ্যাশম্যাপ এবং হ্যাশটেবল ব্যবহার করে থ্রেড সুরক্ষা অর্জন করতে পারি। তবে তাদের আর্কিটেকচারের দিকে নজর দিলে অনেক পার্থক্য রয়েছে।

  1. সিঙ্ক্রোনাইজড হ্যাশম্যাপ এবং হ্যাশটেবল

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

  1. ConcurrentHashMap

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

থ্রেড 1 যদি বিভাগ 2 এ পুট ক্রিয়াকলাপ সম্পাদন করতে চায় এবং থ্রেড 2 বিভাগ 4 এ পুট ক্রিয়াকলাপ সম্পাদন করতে চায় তবে এটি এখানে অনুমোদিত allowed মানে, 16 থ্রেড একসাথে কনকন্টেনশ্যাশম্যাপে আপডেট (পুট / ডিলিট) অপারেশন করতে পারে।

যাতে অপেক্ষার সময়টি এখানে কম হয়। সুতরাং সিঙ্ক্রোনাইজড হ্যাশম্যাপ এবং হ্যাশটেবলের চেয়ে পারফরম্যান্স তুলনামূলকভাবে ভাল।


1
, 1। একাধিক থ্রেড একই ব্লকটি সম্পাদনা করার চেষ্টা করলে কী হয়? ২. যদি বলুন যে দুটি থ্রেড একই ব্লক থেকে ডেটা পড়ার চেষ্টা করে যেখানে অন্য থ্রেড একই সাথে ডেটা লিখতে থাকে?
prnjn

6

ConcurrentHashMap

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

SynchronizedHashMap

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

সূত্র


4

সাম্প্রতিক অ্যাক্সেসের জন্য সাম্প্রতিক হ্যাশম্যাপটি অনুকূলিত।

অ্যাক্সেসগুলি পুরো মানচিত্রটিকে লক করে না তবে একটি সূক্ষ্ম দানযুক্ত কৌশল ব্যবহার করে, যা স্কেলিবিলিটি উন্নত করে। সাম্প্রতিক অ্যাক্সেসের জন্য বিশেষত কার্যকরী বর্ধনগুলিও রয়েছে, যেমন সমকালীন পুনরাবৃত্তকারী।


4

নেই এক সমালোচনামূলক বৈশিষ্ট্য সম্পর্কে খেয়াল করা ConcurrentHashMapসম্পাতবিন্দু বৈশিষ্ট্য এটি উপলব্ধ করা, যা ছাড়া অন্য ব্যর্থ নিরাপদ পুনরুক্তিকারীর। আমি বিকাশকারীদের ConcurrentHashMapকেবলমাত্র এন্ট্রিসেটটি সম্পাদনা করতে চায় বলে ব্যবহার করতে দেখেছি - এতে পুনরাবৃত্তি করার সময় পুট / রিমুভ করুন। ব্যর্থ-নিরাপদ পুনরাবৃত্তি সরবরাহ Collections.synchronizedMap(Map)করে না তবে এটি পরিবর্তে ব্যর্থ-দ্রুত পুনরুক্তি প্রদান করে। ব্যর্থ-দ্রুত পুনরাবৃত্তকারীরা মানচিত্রের আকারের স্ন্যাপশট ব্যবহার করে যা পুনরাবৃত্তির সময় সম্পাদনা করা যায় না।


3
  1. যদি ডেটা ধারাবাহিকতা অত্যন্ত গুরুত্বপূর্ণ - হ্যাশটেবল বা কালেকশনস ynসাইনক্রোনাইজড ম্যাপ (মানচিত্র) ব্যবহার করুন।
  2. যদি গতি / পারফরম্যান্স অত্যন্ত গুরুত্বপূর্ণ এবং ডেটা আপডেটিংয়ের সাথে আপোস করা যেতে পারে- কনকন্টারহ্যাশম্যাপ ব্যবহার করুন।

2

সাধারণভাবে, আপনি যদি ConcurrentHashMapনিশ্চিত হন যে আপনি 'আপডেট' মিস করতে প্রস্তুত তা নিশ্চিত করতে চান
(যেমন হ্যাশম্যাপের মুদ্রণ বিষয়বস্তুটি এটি আপ টু ডেট ম্যাপটি প্রিন্ট করবে তা নিশ্চিত করে না) এবং CyclicBarrierআপনার প্রোগ্রামের জুড়ে ধারাবাহিকতা নিশ্চিত করতে এপিআই ব্যবহার করে জীবনচক্র.


1

কালেকশনস.সিনক্রোনাইজড ম্যাপ () পদ্ধতিটি হ্যাশম্যাপের সমস্ত পদ্ধতি সিঙ্ক্রোনাইজ করে এবং কার্যকরভাবে এটি একটি ডেটা স্ট্রাকচারে হ্রাস করে যেখানে একটি থ্রেড একসাথে প্রবেশ করতে পারে কারণ এটি প্রতিটি লককে সাধারণ লকটিতে লক করে।

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


1

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

কীভাবে সমকালীন হ্যাশম্যাপ বাস্তবায়িত হয়

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

আপনি যদি কনকন্টারহ্যাশম্যাপের কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্যে আগ্রহী এবং মানচিত্রের এই উপলব্ধিটি কখন ব্যবহার করা উচিত - আমি কেবল একটি ভাল নিবন্ধে একটি লিঙ্ক রেখেছি - জাভাতে কীভাবে সাম্প্রতিক হ্যাশম্যাপ ব্যবহার করতে হবে


0

যা প্রস্তাবিত হয়েছে তা ছাড়াও, আমি সম্পর্কিত উত্স কোড পোস্ট করতে চাই SynchronizedMap

একটি Mapথ্রেড নিরাপদ করতে, আমরা ব্যবহার করতে পারিCollections.synchronizedMap প্যারামিটার হিসাবে স্টেটমেন্ট এবং ইনপুট মানচিত্রটি ।

synchronizedMapইন বাস্তবায়ন Collectionsনীচের মত

   public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
        return new SynchronizedMap<>(m);
    }

আপনি দেখতে পাচ্ছেন, ইনপুট Mapঅবজেক্টটি বস্তুটি আবৃত SynchronizedMap
এর বাস্তবায়ন খনন করা যাক SynchronizedMap,

 private static class SynchronizedMap<K,V>
        implements Map<K,V>, Serializable {
        private static final long serialVersionUID = 1978198479659022715L;

        private final Map<K,V> m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize

        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }

        SynchronizedMap(Map<K,V> m, Object mutex) {
            this.m = m;
            this.mutex = mutex;
        }

        public int size() {
            synchronized (mutex) {return m.size();}
        }
        public boolean isEmpty() {
            synchronized (mutex) {return m.isEmpty();}
        }
        public boolean containsKey(Object key) {
            synchronized (mutex) {return m.containsKey(key);}
        }
        public boolean containsValue(Object value) {
            synchronized (mutex) {return m.containsValue(value);}
        }
        public V get(Object key) {
            synchronized (mutex) {return m.get(key);}
        }

        public V put(K key, V value) {
            synchronized (mutex) {return m.put(key, value);}
        }
        public V remove(Object key) {
            synchronized (mutex) {return m.remove(key);}
        }
        public void putAll(Map<? extends K, ? extends V> map) {
            synchronized (mutex) {m.putAll(map);}
        }
        public void clear() {
            synchronized (mutex) {m.clear();}
        }

        private transient Set<K> keySet;
        private transient Set<Map.Entry<K,V>> entrySet;
        private transient Collection<V> values;

        public Set<K> keySet() {
            synchronized (mutex) {
                if (keySet==null)
                    keySet = new SynchronizedSet<>(m.keySet(), mutex);
                return keySet;
            }
        }

        public Set<Map.Entry<K,V>> entrySet() {
            synchronized (mutex) {
                if (entrySet==null)
                    entrySet = new SynchronizedSet<>(m.entrySet(), mutex);
                return entrySet;
            }
        }

        public Collection<V> values() {
            synchronized (mutex) {
                if (values==null)
                    values = new SynchronizedCollection<>(m.values(), mutex);
                return values;
            }
        }

        public boolean equals(Object o) {
            if (this == o)
                return true;
            synchronized (mutex) {return m.equals(o);}
        }
        public int hashCode() {
            synchronized (mutex) {return m.hashCode();}
        }
        public String toString() {
            synchronized (mutex) {return m.toString();}
        }

        // Override default methods in Map
        @Override
        public V getOrDefault(Object k, V defaultValue) {
            synchronized (mutex) {return m.getOrDefault(k, defaultValue);}
        }
        @Override
        public void forEach(BiConsumer<? super K, ? super V> action) {
            synchronized (mutex) {m.forEach(action);}
        }
        @Override
        public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
            synchronized (mutex) {m.replaceAll(function);}
        }
        @Override
        public V putIfAbsent(K key, V value) {
            synchronized (mutex) {return m.putIfAbsent(key, value);}
        }
        @Override
        public boolean remove(Object key, Object value) {
            synchronized (mutex) {return m.remove(key, value);}
        }
        @Override
        public boolean replace(K key, V oldValue, V newValue) {
            synchronized (mutex) {return m.replace(key, oldValue, newValue);}
        }
        @Override
        public V replace(K key, V value) {
            synchronized (mutex) {return m.replace(key, value);}
        }
        @Override
        public V computeIfAbsent(K key,
                Function<? super K, ? extends V> mappingFunction) {
            synchronized (mutex) {return m.computeIfAbsent(key, mappingFunction);}
        }
        @Override
        public V computeIfPresent(K key,
                BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
            synchronized (mutex) {return m.computeIfPresent(key, remappingFunction);}
        }
        @Override
        public V compute(K key,
                BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
            synchronized (mutex) {return m.compute(key, remappingFunction);}
        }
        @Override
        public V merge(K key, V value,
                BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
            synchronized (mutex) {return m.merge(key, value, remappingFunction);}
        }

        private void writeObject(ObjectOutputStream s) throws IOException {
            synchronized (mutex) {s.defaultWriteObject();}
        }
    }

SynchronizedMapইনপুট Mapঅবজেক্টের প্রাথমিক পদ্ধতিতে একটি একক লক যুক্ত হিসাবে সংক্ষিপ্তসারটি কী হতে পারে । লক দ্বারা রক্ষিত সমস্ত পদ্ধতি একই সাথে একাধিক থ্রেড দ্বারা অ্যাক্সেস করা যায় না। এর অর্থ হল স্বাভাবিক ক্রিয়াকলাপগুলি putএবং getএকই সময়ে একই থ্রেডের মাধ্যমে Mapঅবজেক্টের সমস্ত ডেটা কার্যকর করা যেতে পারে ।

এটি Mapএখন অবজেক্ট থ্রেডকে নিরাপদ করে তোলে তবে কিছু পরিস্থিতিতে কিছুটা পারফরম্যান্স ইস্যুতে পরিণত হতে পারে।

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

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