একজন ReentrantLock হয় আনস্ট্রাকচারড , অসদৃশ synchronizedনির্মান - অর্থাৎ আপনি এবং লক করার একটি ব্লক গঠন ব্যবহার করতে হবে না, এমনকি পদ্ধতি জুড়ে একটি লক ধরে রাখতে পারেন। একটি উদাহরণ:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
এই ধরণের প্রবাহ একটি synchronizedনির্মাণে একক মনিটরের মাধ্যমে প্রতিনিধিত্ব করা অসম্ভব ।
এগুলি ছাড়াও, লক পোলিংReentrantLock সমর্থন করে এবং বাধাদানযোগ্য লক অপেক্ষা করে যা সময়সীমা সমর্থন করে । আরও নমনীয় থ্রেড শিডিয়ুলিংকে মঞ্জুরি দিয়ে কনফিগারযোগ্য ফেয়ারনেস নীতিতে সমর্থন রয়েছে ।ReentrantLock
এই শ্রেণীর জন্য নির্মাতা একটি al চ্ছিক ন্যায্যতা পরামিতি গ্রহণ করে । trueকনটেন্টের অধীনে সেট করা থাকলে , লকগুলি দীর্ঘতম-অপেক্ষমান থ্রেডে অ্যাক্সেস মঞ্জুর করে। অন্যথায় এই লকটি কোনও নির্দিষ্ট অ্যাক্সেস অর্ডারের গ্যারান্টি দেয় না। অনেক থ্রেড দ্বারা অ্যাক্সেস করা ফর্সা লকগুলি ব্যবহার করে প্রোগ্রামগুলি ডিফল্ট সেটিংস ব্যবহারের চেয়ে কম সামগ্রিক থ্রুপুট (অর্থাত্ ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেশি) প্রদর্শিত হতে পারে তবে লকগুলি গ্রহণের জন্য এবং ক্ষুধার্ততার অভাবের গ্যারান্টি দিতে সময়ে ছোট ছোট বৈকল্পিকগুলি থাকতে পারে। তবে খেয়াল করুন, লকগুলির ন্যায্যতা থ্রেড শিডিংয়ের ন্যায্যতার গ্যারান্টি দেয় না। সুতরাং, ন্যায্য লকটি ব্যবহার করে একাধিক থ্রেড পর পর একাধিকবার এটি পেতে পারে যখন অন্যান্য সক্রিয় থ্রেডগুলি অগ্রগতি হয় না এবং বর্তমানে লকটি ধরে রাখে না। এছাড়াও লক্ষ করুন যে অরক্ষিতtryLockপদ্ধতি ন্যায্যতা সেটিং সম্মান করে না। অন্যান্য থ্রেড অপেক্ষা করা থাকলেও লকটি পাওয়া গেলে এটি সফল হবে।
ReentrantLock পারে হতে আরো মাপযোগ্য , উচ্চ বিবাদের অধীনে অনেক ভালো অনুষ্ঠানে যোগ দেন। আপনি এই সম্পর্কে আরও পড়তে পারেন এখানে ।
এই দাবির বিরুদ্ধে লড়াই করা হয়েছে; নিম্নলিখিত মন্তব্য দেখুন:
রেন্ট্রেন্ট লক পরীক্ষায়, প্রতিবার একটি নতুন লক তৈরি করা হয়, সুতরাং এখানে কোনও এক্সক্লুসিভ লকিং নেই এবং ফলস্বরূপ তথ্যটি অবৈধ। এছাড়াও, আইবিএম লিঙ্কটি অন্তর্নিহিত বেঞ্চমার্কের জন্য কোনও উত্স কোড সরবরাহ করে না যাতে পরীক্ষা এমনকি সঠিকভাবে পরিচালিত হয়েছিল কিনা তা চিহ্নিত করা অসম্ভব।
আপনার কখন ব্যবহার করা উচিত ReentrantLock? সেই বিকাশকারী ওয়ার্কস নিবন্ধ অনুযায়ী ...
উত্তরটি বেশ সহজ - যখন আপনার আসলে এমন কিছু প্রয়োজন হয় যা সরবরাহ করে যা synchronizedটাইমড লক অপেক্ষা করে, বাধা দেয় এমন লক অপেক্ষা করে, অ-ব্লক-কাঠামোগত লকগুলি, একাধিক শর্তের পরিবর্তনশীল বা লক পোলিংয়ের মতো ব্যবহার করে না use ReentrantLockএছাড়াও স্কেলেবিলিটি সুবিধাগুলি রয়েছে এবং আপনার যদি এমন পরিস্থিতি উপস্থিত হয় যা উচ্চ বিতর্ক প্রদর্শন করে তবে আপনার এটি ব্যবহার করা উচিত তবে মনে রাখবেন যে বিপুল সংখ্যক synchronizedব্লক কখনওই কোনও বিতর্ককেই প্রদর্শন করে না, উচ্চ বিতর্ককে ছেড়ে দেয়। আমি সিঙ্ক্রোনাইজেশন অপ্রতুল প্রমাণিত না হওয়া অবধি সিঙ্ক্রোনাইজেশনের সাথে বিকাশের পরামর্শ দেব, আপনি যদি ব্যবহার করেন তবে "পারফরম্যান্স আরও ভাল হবে" ধরে নেওয়ার পরিবর্তেReentrantLock। মনে রাখবেন, উন্নত ব্যবহারকারীদের জন্য এগুলি উন্নত সরঞ্জাম। (এবং সত্যিকারের উন্নত ব্যবহারকারীরা সাধারণ সরঞ্জামগুলি অপর্যাপ্ত বলে নিশ্চিত না হওয়া পর্যন্ত তারা সন্ধান করতে পারেন এমন সহজ সরঞ্জামগুলিকেই পছন্দ করেন)) বরাবরের মতো, প্রথমে এটিকে সঠিকভাবে তৈরি করুন এবং তারপরে আপনাকে আরও দ্রুত তৈরি করতে হবে কি না তা নিয়ে উদ্বেগ প্রকাশ করুন।