সিঙ্ক্রোনাইজেশন বনাম লক


182

java.util.concurrentএপিআই একটি ক্লাস সরবরাহ করে যার নাম দেওয়া হয় Lockযা মূলত সমালোচনামূলক সংস্থান অ্যাক্সেস করার জন্য নিয়ন্ত্রণটিকে সিরিয়ালাইজ করবে। এটি যেমন পদ্ধতি দেয় park()এবং unpark()

আমরা synchronizedকীওয়ার্ড এবং ব্যবহার wait()এবং notify() notifyAll()পদ্ধতিগুলি ব্যবহার করতে পারলে আমরা অনুরূপ জিনিসগুলি করতে পারি ।

আমি ভাবছি যে এর মধ্যে কোনটি অনুশীলনে ভাল এবং কেন?


1
এখানে সহায়ক নিবন্ধ: javarevisited.blogspot.in/2013/03/…
রুট ট্রাভেলার

উত্তর:


178

আপনি যদি কেবল কোনও বস্তু লক করে থাকেন তবে আমি ব্যবহার করতে পছন্দ করব synchronized

উদাহরণ:

Lock.acquire();
doSomethingNifty(); // Throws a NPE!
Lock.release(); // Oh noes, we never release the lock!

আপনি স্পষ্টভাবে try{} finally{}সর্বত্র করতে হবে।

সিঙ্ক্রোনাইজড সহ, এটি অত্যন্ত পরিষ্কার এবং ভুল হওয়া অসম্ভব:

synchronized(myObject) {
    doSomethingNifty();
}

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

আমার কখনও ব্যবহার করার কারণ ছিল না wait()বা notify()তবে কিছু ভাল থাকতে পারে।


1
লকসপোর্টের বনাম পার্ক / আনপার্কের অপেক্ষা / নোটিফাইয়ের মধ্যে পার্থক্য কী? docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/…
পেসারিয়ার

6
প্রথমে উদাহরণটি তালা দিয়ে বোঝা গেল তবে আমি বুঝতে পেরেছিলাম যে আপনি অবশেষে চেষ্টা করে ব্যবহার করলে অবরুদ্ধ হওয়া ছাড়া সমস্যাটি এড়ানো সম্ভব হবে
উইলিয়াম রিড ২

আহ্ ... সি ++ এ আরআইআইআই মডেলটির প্রশংসা করার জন্য এই মুহুর্তগুলির মধ্যে একটি। std::lock_guard
WhiZTiM

67

আমি ভাবছি যে এর মধ্যে কোনটি অনুশীলনে ভাল এবং কেন?

আমি খুঁজে পেয়েছি যে Lockএবং Condition(এবং অন্যান্য নতুন concurrentক্লাসগুলি) টুলবক্সের জন্য আরও বেশি সরঞ্জাম। আমি আমার পুরানো নখ হাতুড়ি দিয়ে মূল synchronizedশব্দটি ( কীওয়ার্ড) দিয়ে করতে পারি , তবে কিছু পরিস্থিতিতে এটি ব্যবহার করা বিশ্রী ছিল। আমি যখন আমার সরঞ্জাম বাক্সে আরও বেশি সরঞ্জাম যুক্ত করলাম তখন তার মধ্যে বেশ কয়েকটি বিশ্রী পরিস্থিতি অনেক সহজ হয়ে উঠল: একটি রাবার মাললেট, একটি বল-পেন হাতুড়ি, একটি প্রাইবার এবং কিছু পেরেক। যাইহোক , আমার পুরানো নখ হাতুড়ি এখনও তার ব্যবহার ভাগ করে দেখুন।

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

===

আমি মনে করি জাভাডকLock এবং synchronized(জোর আমার) এর মধ্যে পার্থক্য বর্ণনা করার জন্য একটি ভাল কাজ করেছে :

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

...

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

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

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

...

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

লক বাস্তবায়নের প্রদান অতিরিক্ত কার্যকারিতা একটি প্রদানের মাধ্যমে সিঙ্ক্রোনাইজ পদ্ধতি ও বিবৃতি ব্যবহার নিয়ে অ ব্লক অর্জন করতে যাবেন একটি লক (tryLock ()), একটি প্রচেষ্টা লক যে বাধাগ্রস্থ করা যাবে অর্জন একটি প্রচেষ্টা (lockInterruptibly (), এবং অর্জন যে লকটি টাইমআউট করতে পারে (ট্রাইলক (দীর্ঘ, সময়উনিট))।

...


23

আপনি সবকিছুতেই ইউটিলিটি অর্জন করতে পারেন java.util.concurrent মত লো-লেভেল প্রিমিটিভের না synchronized, volatileঅথবা অপেক্ষার / অবহিত

যাইহোক, একযোগে মুদ্রা জটিল এবং বেশিরভাগ লোকেরা এর কোডটি ভুল বা অদক্ষ (বা উভয়) তৈরি করে এর কমপক্ষে কিছু অংশ ভুল করে।

সমবর্তী API টি একটি উচ্চ-স্তরের পদ্ধতির সরবরাহ করে যা ব্যবহার করা সহজ (এবং যেমন নিরাপদ)। সংক্ষেপে, আপনার synchronized, volatile, wait, notifyআর সরাসরি ব্যবহার করার দরকার নেই।

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


2
সরল পুরানো অপেক্ষার / বিজ্ঞপ্তিগুলি কি java.util.concurrent.locks.LockSupport এর পার্ক / আনপার্কের চেয়ে নিম্ন স্তরের আদিম হিসাবে বিবেচিত হয়, বা এটি অন্যভাবে রাউন্ডে রয়েছে?
পেসারিয়ার

@ পেসারিয়র: আমি উভয়কেই নিম্ন-স্তরের হিসাবে বিবেচনা করি (যেমন এমন কিছু যা কোনও অ্যাপ্লিকেশন প্রোগ্রামার সরাসরি ব্যবহার এড়াতে চায়), তবে অবশ্যই java.util.concurrency (যেমন লকস প্যাকেজ) এর নিম্ন-স্তরের অংশগুলি শীর্ষে নির্মিত নেটিভ জেভিএম আদিমদের অপেক্ষা / বিজ্ঞপ্তি (যা এমনকি নিম্ন-স্তরের)।
থাইলো

2
না আমি 3 টির মধ্যেই বোঝাতে চাইছি: থ্রেড.স্লিপ / বিঘ্নিত, অবজেক্ট.উইট / নোটিফাইড, লকসপোর্ট.পার্ক / আনপার্ক, যা সবচেয়ে আদিম?
পেসারিয়ার

2
@ থিলো আমি নিশ্চিত নই যে আপনি কীভাবে আপনার বক্তব্যটিকে সমর্থন করেন java.util.concurrentযা ভাষার বৈশিষ্ট্যগুলি ( synchronized, ইত্যাদি ...) এর চেয়ে [সাধারণভাবে] সহজ । আপনি যখন ব্যবহার করেন তখন কোড লেখার আগে আপনাকে java.util.concurrentসম্পূর্ণ lock.lock(); try { ... } finally { lock.unlock() }করার অভ্যাস করতে হবে যখন আপনি synchronizedপ্রাথমিকভাবে শুরু থেকেই ভাল। এই ভিত্তিতে একা আমি বলব যে synchronizedআপনি তার আচরণ চান তার চেয়ে সহজ (আপনি যদি এর আচরণ চান) java.util.concurrent.locks.Lockপার 4
আইয়ান অউকাম্প

1
ভাববেন না যে আপনি কেবলমাত্র সম্মতিসূচক আদিমদের সাথে অ্যাটমিকএক্সএক্সএক্সএক্স ক্লাসের আচরণের প্রতিলিপি তৈরি করতে পারবেন, কারণ তারা জাভা.ইটিল.কমারেন্টের পূর্বে নাগরিক সিএএস আহ্বানের উপলভ্য নয়।
ডানকান আর্মস্ট্রং

15

আপনি কেন ব্যবহার করতে চান synchronizedবা তার মধ্যে 4 টি প্রধান কারণ রয়েছে java.util.concurrent.Lock

দ্রষ্টব্য: আমি অভ্যন্তরীণ লকিং বলার সময় সিনক্রোনাইজড লকিংয়ের অর্থ।

  1. যখন জাভা 5 রিেন্টেন্টলক্সের সাথে বেরিয়ে এসেছিল তখন তারা প্রমাণ করেছিল যে আন্তঃনৌক লকিংয়ের পরে তারা যথেষ্ট লক্ষণীয় থ্রুপুট পার্থক্য রাখে। আপনি যদি দ্রুত লকিং মেকানিজমটির সন্ধান করছেন এবং 1.5 চালাচ্ছেন তবে jucReentrantLock বিবেচনা করুন। জাভা 6 এর অন্তর্নিহিত লকিং এখন তুলনীয়।

  2. লক করার জন্য jucLock এর বিভিন্ন পদ্ধতি রয়েছে। লক বিঘ্নযোগ্য - লকিং থ্রেডটি বাধা না দেওয়া পর্যন্ত লক করার চেষ্টা করা; সময়সীমার লক - নির্দিষ্ট সময়ের জন্য লক করার চেষ্টা করুন এবং আপনি সফল না হলে ছেড়ে দিন; tryLock - লক করার চেষ্টা, যদি অন্য কোনও থ্রেড ধরে থাকে তবে লকটি ছেড়ে দেওয়া উচিত। এই সব সহজ লক বাদে অন্তর্ভুক্ত করা হয়। অন্তর্নিহিত লকিং কেবল সহজ লকিংয়ের প্রস্তাব দেয়

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

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

5

বার্ট এফ উত্তরের উপরে আমি আরও কিছু জিনিস যুক্ত করতে চাই ।

Locksসূক্ষ্ম দানযুক্ত লক নিয়ন্ত্রণের জন্য বিভিন্ন পদ্ধতির সমর্থন করুন, যা অন্তর্নিহিত মনিটরের ( synchronizedলকস) চেয়ে বেশি অভিব্যক্তিপূর্ণ

একটি লক একটি ভাগ করা সংস্থার একচেটিয়া অ্যাক্সেস সরবরাহ করে: একবারে কেবল একটি থ্রেড লকটি অর্জন করতে পারে এবং ভাগ করা সংস্থানটিতে সমস্ত অ্যাক্সেসের জন্য লকটি প্রথমে অধিগ্রহণ করা দরকার। যাইহোক, কিছু লক একটি ভাগ করা রিসোর্সে সাম্প্রতিক অ্যাক্সেসের অনুমতি দিতে পারে, যেমন একটি রিডরাইটলকের পঠিত লক।

ডকুমেন্টেশন পৃষ্ঠা থেকে সিঙ্ক্রোনাইজেশন লক ওভারের সুবিধা

  1. সিঙ্ক্রোনাইজড পদ্ধতি বা বিবৃতিগুলির ব্যবহার প্রতিটি বস্তুর সাথে সম্পর্কিত অন্তর্নিহিত মনিটর লকটিতে অ্যাক্সেস সরবরাহ করে তবে সমস্ত লক অধিগ্রহণ এবং রিলিজকে ব্লক-কাঠামোগত উপায়ে ঘটতে বাধ্য করে

  2. লক বাস্তবায়নগুলি একটি অর্জন করার জন্য একটি অ-ব্লকিং প্রচেষ্টা lock (tryLock()), বাধা দেওয়া যেতে পারে lockInterruptibly()এমন লক অর্জনের একটি প্রচেষ্টা (এবং লকটি অর্জন করতে পারে এমন একটি প্রচেষ্টা) সরবরাহ করে সিঙ্ক্রোনাইজড পদ্ধতি এবং বিবৃতিগুলির ব্যবহারের উপরে অতিরিক্ত কার্যকারিতা সরবরাহ করে timeout (tryLock(long, TimeUnit))

  3. লক শ্রেণিটি এমন আচরণ এবং শব্দার্থবিজ্ঞানও সরবরাহ করতে পারে যা অন্তর্ভুক্ত মনিটরের লকের থেকে একেবারে পৃথক, যেমন গ্যারান্টিযুক্ত অর্ডারিং, অ-প্রেরণকারী ব্যবহার, বা অচল সনাক্তকরণ

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

ReentrantLockএই নিবন্ধ অনুযায়ী মূল বৈশিষ্ট্য

  1. বাধা দিয়ে লক করার ক্ষমতা।
  2. লকটির জন্য অপেক্ষা করার সময়সীমা শেষ করার ক্ষমতা।
  3. ফর্সা লক তৈরির শক্তি।
  4. লক জন্য অপেক্ষা থ্রেডের তালিকা পেতে এপিআই API
  5. ব্লক না করে লকটির চেষ্টা করার নমনীয়তা।

তুমি ব্যবহার করতে পার ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock পড়া এবং লেখার ক্রিয়াকলাপগুলিতে দানাদার লকিংয়ের উপর আরও নিয়ন্ত্রণ অর্জন ।

এই তিনটি রেন্ট্রেন্টলক ছাড়াও জাভা 8 আরও একটি লক সরবরাহ করে

StampedLock:

স্ট্যাম্পডলক নামে একটি নতুন ধরণের লক সহ জাভা ৮ টি জাহাজ যা উপরের উদাহরণের মতো লকগুলি পড়া এবং লেখার পক্ষে সমর্থন করে। স্ট্যাম্পডলকের লকিং পদ্ধতিগুলি রিডরাইটলকের বিপরীতে একটি দীর্ঘ মান দ্বারা প্রতিনিধিত্ব করা একটি স্ট্যাম্প ফিরিয়ে দেয়।

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

বিভিন্ন ধরণের এবং লকগুলির ব্যবহার সম্পর্কে এই নিবন্ধটি দেখুন ।ReentrantLockStampedLock


4

মূল পার্থক্যটি হল ন্যায্যতা, অন্য কথায় অনুরোধগুলি কি ফিফো পরিচালিত হয় বা বার্জিং হতে পারে? পদ্ধতি স্তরের সিঙ্ক্রোনাইজেশন লকটির ন্যায্য বা ফিফোর বরাদ্দ নিশ্চিত করে। ব্যবহার

synchronized(foo) {
}

অথবা

lock.acquire(); .....lock.release();

ন্যায্যতা আশ্বাস দেয় না।

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

এই বিষয়টির সম্পূর্ণ আলোচনার জন্য ব্রায়ান গয়েটসের "জাভা কনকুরન્સી ইন প্র্যাকটিস" বইটি, বিভাগ 13.3 দেখুন।


5
"মেথড লেভেলের সিঙ্ক্রোনাইজেশন লকটির ন্যায্য বা ফিফোর বরাদ্দ নিশ্চিত করে।" => সত্যি? আপনি কি বলছেন যে একটি সিঙ্ক্রোনাইজড পদ্ধতিটি সিঙ্ক্রোনাইজড}} ব্লকে পদ্ধতিগুলির বিষয়বস্তু মোড়কের চেয়ে আলাদাভাবে রিট ফর্সা আচরণ করে? আমিও তাই ভাবব না, নাকি আমি এই বাক্যটি ভুল বুঝতে পেরেছি ...?
ওয়েয়ার্স

হ্যাঁ, যদিও বিস্ময়কর এবং পাল্টা স্বজ্ঞাত এইগুলি সঠিক ts গয়েটসের বইটি সেরা ব্যাখ্যা।
ব্রায়ান টারবক্স

আপনি যদি @ ব্রায়ানটারবক্সের সরবরাহিত কোডটি দেখেন তবে সিঙ্ক্রোনাইজড ব্লকটি "এটি" ব্যতীত অন্য কোনও অবজেক্ট লক করতে ব্যবহার করছে। তত্ত্বের মধ্যে একটি সিঙ্ক্রোনাইজড পদ্ধতি এবং পুরো পদ্ধতিটিকে পুরোপুরি সিঙ্ক্রোনাইজড ব্লকের ভিতরে রাখার মধ্যে কোনও পার্থক্য নেই, যতক্ষণ না ব্লকটি "এই "টিকে লক হিসাবে ব্যবহার করে।
xburgos

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

দুঃখিত, আমি সবেমাত্র আবিষ্কার করেছি যে আমি কিছুদিন আগে ভুলভাবে এই উত্তরটি ডাউন-ভোট দিয়েছি (আনাড়ি ক্লিক)। দুর্ভাগ্যক্রমে, SO বর্তমানে আমাকে এটিকে ফিরিয়ে দিতে দেবে না। আশা করি আমি পরে এটি ঠিক করতে পারি।
মিক্কো lstlund

3

ব্রায়ান গয়েটসের "জাভা কনকুরન્સી ইন প্র্যাকটিস" বইয়ের বিভাগ, ১৩.৩: "... ডিফল্ট রেন্টেন্টলকের মতো, অন্তর্নিহিত লকিং কোনও নির্বিচারক সুষ্ঠুতা গ্যারান্টি দেয় না, তবে বেশিরভাগ লকিং বাস্তবায়নের পরিসংখ্যানগত ন্যায্যতা গ্যারান্টি প্রায় সব পরিস্থিতিতেই যথেষ্ট উপযুক্ত ..."


1

লক প্রোগ্রামারদের জীবনকে সহজ করে তোলে। এখানে কয়েকটি পরিস্থিতি রয়েছে যা লক দিয়ে সহজেই অর্জন করা যায়।

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

যখন, লক এবং শর্তগুলি সিঙ্ক্রোনাইজ করা থাকে। সুতরাং অবশ্যই আপনি যে একই লক্ষ্য অর্জন করতে পারেন। তবে এটি আপনার জীবনকে কঠিন করে তুলতে পারে এবং প্রকৃত সমস্যা সমাধানে আপনাকে বিচ্যুত করতে পারে।


1

লক এবং সিঙ্ক্রোনাইজড মধ্যে প্রধান পার্থক্য:

  • লক সহ, আপনি যে কোনও ক্রমে লকগুলি মুক্তি এবং অর্জন করতে পারেন।
  • সিঙ্ক্রোনাইজ করা সহ, আপনি লকগুলি কেবল অর্ডারকৃত অর্ডারে মুক্তি দিতে পারেন।

0

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

void randomFunction(){
.
.
.
synchronize(this){
//do some functionality
}

.
.
.
synchronize(this)
{
// do some functionality
}


} // end of randomFunction

উপরের ক্ষেত্রে, যদি কোনও থ্রেড সিঙ্ক্রোনাইজ ব্লকে প্রবেশ করে, অন্য ব্লকটিও লক হয়ে গেছে। যদি একই বস্তুতে এমন একাধিক সিঙ্ক্রোনাইজ ব্লক থাকে তবে সমস্ত ব্লক লক হয়ে যায়। এই জাতীয় পরিস্থিতিতে, java.util.concurrent.Lock ব্লকগুলির অবাঞ্ছিত লকিং রোধ করতে ব্যবহার করা যেতে পারে

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