যদি কেউ সিঙ্ক্রোনাইজড (এটি) ব্যবহার করতে পারে তবে কেন একটি রেন্টেন্টলক ব্যবহার করবেন?


317

আমি বুঝতে কি সম্পাতবিন্দু মধ্যে লক এত গুরুত্বপূর্ণ যদি ব্যবহার করতে পারেন তোলে চেষ্টা করছি synchronized (this)। নীচের ডামি কোডে, আমি এটি করতে পারি:

  1. সম্পূর্ণ পদ্ধতিটি সিঙ্ক্রোনাইজ করুন বা অরক্ষিত অঞ্চলটি সংহত করুন ( synchronized(this){...})
  2. বা একটি রিরেন্ট্যান্ট লক দিয়ে দুর্বল কোড অঞ্চলটি লক করুন।

কোড:

    private final ReentrantLock lock = new ReentrantLock(); 
    private static List<Integer> ints;

    public Integer getResult(String name) { 
        .
        .
        .
        lock.lock();
        try {
            if (ints.size()==3) {
                ints=null;
                return -9;
            }   

            for (int x=0; x<ints.size(); x++) {
                System.out.println("["+name+"] "+x+"/"+ints.size()+". values >>>>"+ints.get(x));
            }

        } finally {
            lock.unlock();
        } 
        return random;
}

1
বিটিডাব্লু সমস্ত জাভা অভ্যন্তরীণ লক প্রকৃতির দ্বারা প্রেরণ করা হয়।
অনিকেত ঠাকুর

@ পঙ্গাপুণ্ডিত তাই synchronized(this){synchronized(this){//some code}}মৃত লক সৃষ্টি করবে না। অভ্যন্তরীণ লকের জন্য যদি তারা কোনও সংস্থার উপর নজরদারি গ্রহণ করে এবং তারা যদি আবার এটি চায় তবে তারা কোনও মৃত লক ছাড়াই এটি পেতে পারে।
অনিকেত ঠাকুর

উত্তর:


474

একজন 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। মনে রাখবেন, উন্নত ব্যবহারকারীদের জন্য এগুলি উন্নত সরঞ্জাম। (এবং সত্যিকারের উন্নত ব্যবহারকারীরা সাধারণ সরঞ্জামগুলি অপর্যাপ্ত বলে নিশ্চিত না হওয়া পর্যন্ত তারা সন্ধান করতে পারেন এমন সহজ সরঞ্জামগুলিকেই পছন্দ করেন)) বরাবরের মতো, প্রথমে এটিকে সঠিকভাবে তৈরি করুন এবং তারপরে আপনাকে আরও দ্রুত তৈরি করতে হবে কি না তা নিয়ে উদ্বেগ প্রকাশ করুন।


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

2
আমি আপনার প্রতিক্রিয়ার আলোকে পোস্টটি পরিবর্তন করেছি।
oldrinb

6
যদি পারফরম্যান্স আপনার পক্ষে উচ্চ উদ্বেগের বিষয় হয়ে থাকে তবে এমন কোনও উপায় সন্ধান করতে ভুলবেন না যেখানে আপনার মোটেই কোনও সঙ্কলন প্রয়োজন নয়।
mcoolive

2
পারফরম্যান্স জিনিসটি আমার কাছে মোটেই বোঝা যায় না। যদি পুনঃতন্ত্রিত লকটি আরও ভাল সম্পাদন করতে পারে তবে কেন পুনরেন্ট্যান্ট লকটি একইভাবে প্রয়োগ করা হবে না কেন একইভাবে পুনরায় প্রবর্তক লকটি অভ্যন্তরীণভাবে প্রয়োগ করা হবে?
tobi

2
@ ব্যবহারকারী 2761895 ReentrantLockPseudoRandomলাইকোগ লিঙ্কের কোডটি একেবারে নতুন, অযৌক্তিক লকগুলি ব্যবহার করছে setSeedএবংnext
23rin

14

ReentrantReadWriteLockএকটি বিশেষায়িত লক যেখানে synchronized(this)একটি সাধারণ উদ্দেশ্য লক। এগুলি একই রকম তবে একরকম নয়।

আপনি ঠিক যে আপনি synchronized(this)পরিবর্তে ব্যবহার করতে পারেন ReentrantReadWriteLockকিন্তু বিপরীত সবসময় সত্য হয় না।

আপনি যদি আরও ভালভাবে বুঝতে চান তবে কী ReentrantReadWriteLockপ্রযোজক-গ্রাহক থ্রেড সিঙ্ক্রোনাইজেশন সম্পর্কে কিছু তথ্য বিশেষ অনুসন্ধান করে।

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

যাইহোক, synchronized(this)- এবং একটি সর্বজনীন শ্রেণীর উদাহরণ ব্যবহার করে সাধারণ লক করা সমস্যাযুক্ত হতে পারে কারণ এটি আপনার কোডটি সম্ভাব্য মৃত-লকগুলিতে উন্মুক্ত করে কারণ অন্য কেউ জেনেশুনে প্রোগ্রামে অন্য কোনও কারণে আপনার বস্তুর বিরুদ্ধে লক করার চেষ্টা করতে পারে।


সম্ভাব্য মৃত-লকগুলি রোধ করতে পারে কারণ অন্য কেউ জেনেশুনে আপনার অবজেক্টের বিরুদ্ধে অন্য কোথাও লক করার চেষ্টা করতে পারে প্রগমে কোনও ব্যক্তিগত অবজেক্ট উদাহরণটি সিঙ্ক্রোনাইজেশন মনিটরের মতো ব্যবহার করুন: public class MyLock { private final Object protectedLongLockingMonitor = new Object(); private long protectedLong = 0L; public void incrementProtectedLong() { synchronized(protectedLongLockingMonitor) { protectedLong++; } } }
সুশীকত্ত

9

রিরেন্ট্যান্টলক সম্পর্কে ওরাকল ডকুমেন্টেশন পৃষ্ঠা থেকে :

সামঞ্জস্যীকৃত পদ্ধতি এবং বিবৃতি ব্যবহার করে, তবে প্রসারিত দক্ষতার সাথে একই বুনিয়াদী আচরণ এবং শব্দার্থবিজ্ঞানের সাথে একটি প্রেরণকারী মিউচুয়াল এক্সক্লুসিভ লক ock

  1. একটি রেন্টেন্টালক শেষ সাফল্যের সাথে লক করা থ্রেডের মালিকানাধীন, তবে এটি এখনও আনলক করা হয়নি। লকটি অন্য থ্রেডের মালিকানা না পেয়ে সফলভাবে লকটি অর্জন করে একটি থ্রেড চালানো লক ফিরে আসবে। যদি বর্তমান থ্রেডটি ইতিমধ্যে লকের মালিক হয় তবে পদ্ধতিটি তত্ক্ষণাত্ ফিরে আসবে।

  2. এই শ্রেণীর জন্য নির্মাতা একটি al চ্ছিক ন্যায্যতা পরামিতি গ্রহণ করে । যখন সত্য হিসাবে সেট করা হয়, তর্কসাপেক্ষে, লকগুলি দীর্ঘতম-অপেক্ষমান থ্রেডে অ্যাক্সেস মঞ্জুর করে । অন্যথায় এই লকটি কোনও নির্দিষ্ট অ্যাক্সেস অর্ডারের গ্যারান্টি দেয় না।

এই নিবন্ধ অনুসারে মূল বৈশিষ্ট্যগুলিকে রিন্টারেন্টলক করুন

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

আপনি রিডেন্ট রাইডড্রাইটলক ব্যবহার করতে পারেন e রিডলক, রিেন্টেন্টরিডড্রাইটলক W রাইটলক এবং পড়া লেখার ক্রিয়াকলাপগুলিতে দানাদার লকিংয়ের উপর আরও নিয়ন্ত্রণ অর্জন করতে acquire

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


2

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

private final ReentrantLock lock = new ReentrantLock(true);
//the param true turns on the fairness policy. 

"ফেয়ারনেস পলিসি" চালানোর জন্য পরবর্তী চলমান থ্রেড বেছে নিয়েছে। এটি অগ্রাধিকারের উপর ভিত্তি করে তৈরি হয়েছে, শেষ দৌড়া থেকে সময়, বেলা বেলা

এছাড়াও, সিঙ্ক্রোনাইজ অনির্দিষ্টকালের জন্য ব্লক করতে পারে যদি এটি ব্লক থেকে বাঁচতে না পারে। রেন্টারলটকের সময়সীমা সেট থাকতে পারে।


1

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

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


1

ধরে নেওয়া যাক এই কোডটি একটি থ্রেডে চলছে:

private static ReentrantLock lock = new ReentrantLock();

void accessResource() {
    lock.lock();
    if( checkSomeCondition() ) {
        accessResource();
    }
    lock.unlock();
}

থ্রেডটি লকের মালিক বলে এটি একাধিক কলকে () লক করতে দেয়, তাই এটি লকটি পুনরায় প্রবেশ করে। এটি একটি রেফারেন্স গণনা দিয়ে অর্জন করা যেতে পারে তাই এটি আবার লক অর্জন করতে হবে না।


0

একটি জিনিস মনে রাখবেন:

' রিেন্টেন্টলক ' নামটি অন্যান্য লকিং প্রক্রিয়া সম্পর্কে ভুল বার্তা দেয় যে তারা পুনরায় প্রবেশকারী নয় rant এটি সত্য নয়। 'সিঙ্ক্রোনাইজড' এর মাধ্যমে অর্জিত লকটি জাভাতে পুনরায় প্রবেশকারী।

মূল পার্থক্যটি হ'ল লিংক এপিআই দেয় না এমন সময়ে 'সিঙ্ক্রোনাইজড' অন্তর্নিহিত লক ব্যবহার করে (প্রতিটি বস্তুর মধ্যে একটি এটি)।


0

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

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