মাল্টি-থ্রেডেড প্রোগ্রামগুলি নিয়মিতভাবে এমন পরিস্থিতিতে আসতে পারে যেখানে একাধিক একই সংস্থানটিতে পৌঁছানোর চেষ্টা যা প্রতারণামূলক এবং চমকপ্রদ ফলাফল তৈরি করে। এটি জাভাতে সিঙ্ক্রোনাইজেশন ব্যবহার করে সমাধান করা যেতে পারে। কেবলমাত্র একটি নির্দিষ্ট নির্দিষ্ট থ্রেড নির্দিষ্ট সময়ের জন্য সংস্থানটিতে যেতে পারে। এই নিবন্ধটি আপনাকে সিঙ্ক্রোনাইজেশন কৌশলটির সাথে পরিচিত হতে সহায়তা করবে।
আমি এই ক্রমে বিষয়গুলি নিয়ে আলোচনা করব:
- জাভাতে সিঙ্ক্রোনাইজেশন কেন ব্যবহার করবেন?
- সিঙ্ক্রোনাইজেশন প্রকার
- জাভা লক
- সিঙ্ক্রোনাইজেশন ছাড়াই মাল্টি-থ্রেডিং
- সিঙ্ক্রোনাইজেশন সহ একাধিক থ্রেডিং
- সিঙ্ক্রোনাইজড কীওয়ার্ড
- সিঙ্ক্রোনাইজড কীওয়ার্ড এবং সিঙ্ক্রোনাইজড ব্লকের মধ্যে পার্থক্য
চল শুরু করি!
জাভাতে সিঙ্ক্রোনাইজেশন কেন ব্যবহার করবেন?
আপনি যদি কোনও প্রোগ্রামের মধ্যে কমপক্ষে দুটি থ্রেড দিয়ে শুরু করেন তবে একাধিক থ্রেড একই সংস্থানটিতে যাওয়ার চেষ্টা করার সুযোগ থাকতে পারে। এটি সম্মতিযুক্ত সমস্যার কারণে একটি অপ্রত্যাশিত ফলাফলও তৈরি করতে পারে।
বাক্য গঠন :
সিঙ্ক্রোনাইজড (অবজেক্টডেন্টিফায়ার) {// ভাগ করা ভেরিয়েবল এবং অন্যান্য ভাগ করা সংস্থানগুলিতে অ্যাক্সেস করুন}
উদাহরণ স্বরূপ, সমতুল্য ফাইলের মধ্যে লেখার চেষ্টা করুন। থ্রেডগুলির মধ্যে একটি ডেটা ওভাররাইড করতে পারে বা কোনও থ্রেড যখন খুলছে তখন এটি ডেটাটিকে দূষিত করতে পারেএকই ফাইল একই সময়ে, অন্য থ্রেড একই ফাইলটি বন্ধ হতে পারে।একাধিক থ্রেডের ক্রিয়া সিঙ্ক্রোনাইজ করার দরকার আছে। এটি ডাকা একটি ধারণা ব্যবহার করে প্রয়োগ করা যেতে পারে এম আক্রমণকারী ।
- প্রতিটি একটি মনিটরের সাথে সম্পর্কিত, যা কোনও থ্রেড লক বা আনলক করতে পারে।
- একবারে কেবল একটি থ্রেড মনিটরে একটি লক ধরে রাখতে পারে।
- জাভা প্রোগ্রামিং ল্যাঙ্গুয়েডগুলি ব্যবহার করে থ্রেডগুলি তৈরি এবং তাদের কাজটি সিঙ্ক্রোনাইজ করার খুব সহজ উপায় সরবরাহ করে সিঙ্ক্রোনাইজড ব্লক
- এটি এই নির্দিষ্ট ব্লকের মধ্যে ভাগ করা সংস্থানগুলি রাখে।
জাভাতে সিঙ্ক্রোনাইজড ব্লকগুলি সাথে চিহ্নিত করা হয় সিঙ্ক্রোনাইজড কীওয়ার্ড জাভাতে এই ব্লকটি কিছু বস্তুর সাথে সিঙ্ক্রোনাইজ করা হয়েছে।একই অবজেক্টে সিঙ্ক্রোনাইজ করা সমস্ত ব্লকগুলির মধ্যে একবারে কেবল একটি থ্রেড চালানো যেতে পারে। সিঙ্ক্রোনাইজড ব্লকের ভিতরে থাকা থ্রেডটি ব্লকটি না বের হওয়া পর্যন্ত সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করার চেষ্টা করা অন্য সমস্ত থ্রেডগুলি অবরুদ্ধ করা হবে।
সিঙ্ক্রোনাইজেশন প্রকার
মূলত দুটি ধরণের সিঙ্ক্রোনাইজেশন উপলব্ধ। তারা হ'ল:
- প্রক্রিয়া সিঙ্ক্রোনাইজেশন: একাধিক থ্রেড বা প্রক্রিয়াগুলির যুগপত সম্পাদন এমন অবস্থায় পৌঁছতে যাতে তারা ক্রিয়াকলাপের একটি নির্দিষ্ট ক্রমের প্রতিশ্রুতিবদ্ধ।
- থ্রেড সিঙ্ক্রোনাইজেশন: এক সময় যখন একাধিক থ্রেড থাকেএকটি ভাগ করা সংস্থান অ্যাক্সেস করার চেষ্টা করে, আপনাকে নিশ্চিত করতে হবে যে কেবলমাত্র একটি থ্রেড দ্বারা সংস্থান ব্যবহৃত হবেএকটি সময়.
আসুন এই ধরণের বিশদে getুকতে না পারা এবং লকগুলি কী রয়েছে তা বোঝার চেষ্টা করুন ।
জাভা লক
যেমনটি আমি আগেই বলেছি, সিঙ্ক্রোনাইজেশনটি একটি অভ্যন্তরীণ সত্তা হিসাবে পরিচিত হিসাবে তৈরি করা হয় লক বা নিরীক্ষণ । প্রতিটি বস্তুর সাথে এর সাথে যুক্ত একটি লক থাকে। সুতরাং কোনও থ্রেডের জন্য যা অবজেক্টের ক্ষেত্রগুলিতে অবিচ্ছিন্ন অ্যাক্সেসের প্রয়োজন সেগুলি অ্যাক্সেস করার আগে অবজেক্টের লকটি অর্জন করতে হবে এবং কাজ শেষ হয়ে গেলে লকটি ছেড়ে দেওয়া উচিত release
জাভা 5 থেকে, java.util.concurrent.locks প্যাকেজটিতে অনেকগুলি লক প্রয়োগ রয়েছে।
লকটি দেখতে কেমন লাগে:
পাবলিক ক্লাস লক {প্রাইভেট বুলিয়ান আইলকড = মিথ্যা পাবলিক সিঙ্ক্রোনাইজড শূন্য লক () ছুড়ে ফেলেছে বাধা E যখন (isLock) {অপেক্ষা ()} isLock = সত্য} পাবলিক সিঙ্ক্রোনাইজ ভয়েড আনলক () L isLock = মিথ্যা বিজ্ঞপ্তি ()}}
লক () পদ্ধতিটি লক ইনস্টলসটি লক করে রাখে যাতে আনলক () কার্যকর না হওয়া পর্যন্ত সমস্ত থ্রেড কলিং লক () অবরুদ্ধ থাকে।
সিঙ্ক্রোনাইজেশন ছাড়াই মাল্টি-থ্রেডিং
এখানে একটি সাধারণ উদাহরণ যা একটি অনুক্রমের মধ্যে পাল্টা মানটি প্রিন্ট করে এবং প্রতিবার আমরা এটি চালাই, এটি কোনও থ্রেডে সিপিইউ উপলব্ধতার উপর ভিত্তি করে একটি আলাদা ফলাফল তৈরি করে। এটা দেখ!
মাল্টিথ্রেড ক্লাস {সর্বজনীন শূন্য প্রিন্টকাউন্ট () {চেষ্টা করুন {এর জন্য (int i = 5 i)<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }
উপরোক্ত প্রোগ্রামের ফলাফল এতে:
জাভা মধ্যে কি বিস্মৃত হয়
সিঙ্ক্রোনাইজেশন সহ একাধিক থ্রেডিং
এটি উপরের মতো একই উদাহরণ তবে এটি ক্রমের মধ্যে পাল্টা মানটি প্রিন্ট করে। প্রতিবার আমরা এটি চালানোর সময়, এটি একই ফলাফল তৈরি করে।
মাল্টিথ্রিড ক্লাস {সার্বজনীন শূন্য প্রিন্টকাউন্ট () {চেষ্টা করুন ((int i = 5 i> 0 i--) {System.out.println ('কাউন্টার ---' + i)} (ক্যাচ (ব্যতিক্রম ই) {সিস্টেম। out.println ('থ্রেড বাধাপ্রাপ্ত।')}}} ক্লাস থ্রেড মাল্ট্রিথ্রেড {প্রাইভেট থ্রেড টি প্রাইভেট স্ট্রিং থ্রেডনাম মাল্টিট্রিড এমটি থ্রেড (স্ট্রিং নাম, মাল্টিথ্রেড এমটি) {থ্রেডনাম = নাম এমটি = এমটি} পাবলিক অকার্যকর রান () nch সিঙ্ক্রোনাইজড ( এমটি) T এমটি.প্রিন্টকাউন্ট ()} System.out.println ('থ্রেড' + থ্রেডনাম + 'প্রস্থান করা হচ্ছে।')} সার্বজনীন শূন্যতম শুরু () {System.out.println ('শুরু করা' + থ্রেডনাম) যদি (t == নাল) {t = নতুন থ্রেড (এটি, থ্রেডনাম) t.start ()}}} পাবলিক ক্লাস টেস্টথ্রেড {পাবলিক স্ট্যাটিক শূন্য মূল (স্ট্রিং আরগস []) ult মাল্টিথ্রেড এমটি = নতুন মাল্ট্রিথ () থ্রেড টি = নতুন থ্রেড ('থ্রেড - 1 ', এমটি) থ্রেড টি 1 = নতুন থ্রেড (' থ্রেড - 2 ', এমটি) টি.স্টার্ট () টি 1.স্টার্ট () // থ্রেডগুলি শেষ করার জন্য অপেক্ষা করুন {T.join () T1.join ()} ধরা (ব্যতিক্রম ই) {System.out.println ('বাধা')}}}
আউটপুট নীচে চিত্রিত করা হয়:
সিঙ্ক্রোনাইজড কীওয়ার্ড
সিঙ্ক্রোনাইজড কীওয়ার্ড একটি ব্লক বা একটি পদ্ধতি একটি সমালোচনা বিভাগ চিহ্নিত করে। একটি সমালোচনামূলক বিভাগ যেখানে একটি সময়ে কেবল একটি থ্রেড সঞ্চালিত হয়, এবং থ্রেডটি সিঙ্ক্রোনাইজড বিভাগের জন্য লকটি ধারণ করে। এই সিঙ্ক্রোনাইজড কীওয়ার্ড লেখায় সহায়তা করে সমকালীন যে কোনও আবেদনের অংশ। এটি ব্লকের মধ্যে ভাগ করা সংস্থানগুলিকে সুরক্ষা দেয়।
সিঙ্ক্রোনাইজ করা কীওয়ার্ড এর সাথে ব্যবহার করা যেতে পারে:
জাভাতে স্ট্রিংকে তারিখ বিন্যাসে রূপান্তর করুন
কোড ব্লক নিয়ে আলোচনা করা যাক।
সিঙ্ক্রোনাইজড কীওয়ার্ড: একটি কোড ব্লক
বাক্য গঠন
একটি সিঙ্ক্রোনাইজড ব্লক লেখার জন্য সাধারণ সিনট্যাক্সটি হ'ল:
সিঙ্ক্রোনাইজড (লকঅবজেক্ট) {// সিঙ্ক্রোনাইজড স্টেটমেন্টস}
যখন কোনও থ্রেড ব্লকের অভ্যন্তরে সিঙ্ক্রোনাইজ করা বিবৃতিগুলি কার্যকর করতে চায়, তখন এটি অবশ্যই লকঅবজেক্টের মনিটরে লকটি অর্জন করতে হবে। শুধুমাত্র একটি থ্রেড একবারে লক অবজেক্টের মনিটর অর্জন করতে পারে। সুতরাং অন্যান্য সকল থ্রেডকে অবশ্যই বর্তমানে সম্পাদনকারী থ্রেডটি লকটি অর্জন এবং এর কার্য সম্পাদন শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে।
এই ভাবে, সিঙ্ক্রোনাইজড কীওয়ার্ডটি গ্যারান্টি দেয় যে কেবলমাত্র একটি থ্রেড একসাথে সিঙ্ক্রোনাইজড ব্লক স্টেটমেন্টগুলি সম্পাদন করবে এবং এইভাবে ব্লকের অভ্যন্তরে উপস্থিত ডেটা ভাগ করা ডেটাগুলি দূষিত করা থেকে একাধিক থ্রেডকে বাধা দেয়।
বিঃদ্রঃ :
- যদি কোনও থ্রেড ঘুমাতে দেওয়া হয় (ব্যবহার করে)
ঘুম()
পদ্ধতি) তারপরে এটি লকটি প্রকাশ করে না। এই ঘুমের সময়, কোনও থ্রেড সিঙ্ক্রোনাইজড ব্লক স্টেটমেন্টগুলি সম্পাদন করবে না। - জাভা সিঙ্ক্রোনাইজেশন নিক্ষেপ করবে নাল পয়েন্টার ব্যতিক্রম যদি লক অবজেক্টটিতে ব্যবহৃত হয় সিঙ্ক্রোনাইজড (লক) ‘শূন্য।
এখন, পদ্ধতিটি নিয়ে আলোচনা করা যাক।
সিঙ্ক্রোনাইজ করা কীওয়ার্ড: একটি পদ্ধতি
বাক্য গঠন
একটি লেখার জন্য সাধারণ বাক্য গঠন সিঙ্ক্রোনাইজড পদ্ধতি হ'ল:
সিঙ্ক্রোনাইজড পদ্ধতি (পরামিতি) {// সিঙ্ক্রোনাইজড কোড}
এখানে লকঅবজেক্ট কেবলমাত্র এমন একটি সামগ্রীর রেফারেন্স যার লক মনিটরের সাথে সম্পর্কিত যা সিঙ্ক্রোনাইজড স্টেটমেন্টগুলি উপস্থাপন করে।
সিঙ্ক্রোনাইজড ব্লকের অনুরূপ, একটি থ্রেড অবশ্যই সিঙ্ক্রোনাইজড পদ্ধতিতে সংযুক্ত মনিটরের অবজেক্টের লকটি অর্জন করতে হবে। সিঙ্ক্রোনাইজড পদ্ধতির ক্ষেত্রে লক অবজেক্টটি হ'ল:
- ‘.ক্লাস’ অবজেক্ট - যদি প্রদত্ত পদ্ধতিটি হয় স্থির ।
- ‘এই’ বস্তু - যদি পদ্ধতি হয় অ-স্থির । ‘এটি’ হ'ল বর্তমান সামগ্রীর রেফারেন্স যেখানে সিঙ্ক্রোনাইজড পদ্ধতিটি চালু করা হয়।
জাভা সিঙ্ক্রোনাইজড কীওয়ার্ডটি হ'ল পুনরায় প্রবেশ প্রকৃতিতে. এর অর্থ যদি একটি সিঙ্ক্রোনাইজড পদ্ধতিতে অন্য একটি সিঙ্ক্রোনাইজড পদ্ধতিতে কল করে যার জন্য একই লকটির প্রয়োজন হয়, তবে বর্তমান থ্রেড যা লকটি ধারণ করে তা লকটি অর্জন না করে সেই পদ্ধতিতে প্রবেশ করতে পারে।
আসুন আমরা এই নিবন্ধের চূড়ান্ত বিষয়ে এগিয়ে যাই এবং সিঙ্ক্রোনাইজড কীওয়ার্ড এবং সিঙ্ক্রোনাইজেশন ব্লকের মধ্যে প্রধান পার্থক্যগুলি চিহ্নিত করি।
সিঙ্ক্রোনাইজড কীওয়ার্ড এবং সিঙ্ক্রোনাইজড ব্লকের মধ্যে পার্থক্য
- আপনি যখন একটি এর সাথে সিঙ্ক্রোনাইজড কীওয়ার্ড ব্যবহার করেন পদ্ধতি , এটি পুরো পদ্ধতির জন্য অবজেক্টে একটি লক অর্জন করে। এর অর্থ হ'ল বর্তমান থ্রেডটি চালানো শেষ না হওয়া অবধি অন্য কোনও থ্রেড কোনও সিঙ্ক্রোনাইজড পদ্ধতি ব্যবহার করতে পারে না।
- সিঙ্ক্রোনাইজড ব্লক সিঙ্ক্রোনাইজড কীওয়ার্ড নির্দিষ্ট করার পরে কেবল বন্ধনীগুলির মধ্যে অবজেক্টে একটি লক অর্জন করে। এর অর্থ হ'ল ব্লকটি প্রস্থান না হওয়া অবধি অন্য কোনও থ্রেড ইতিমধ্যে লক করা অবজেক্টটিতে লক অর্জন করতে পারে না। তবে অন্যান্য থ্রেড পদ্ধতিতে উপস্থিত বাকী কোডটি অ্যাক্সেস করতে সক্ষম হবে।
এটি আমাদের এই নিবন্ধের শেষে নিয়ে আসে যেখানে আমরা জাভাতে সিঙ্ক্রোনাইজেশন ঠিক কীভাবে কাজ করে তা নিয়ে আলোচনা করেছি। আশা করি এই টিউটোরিয়ালে আপনার সাথে যা ভাগ করা হয়েছে তার সাথে আপনি পরিষ্কার হয়ে গেছেন।
দেখুন বিশ্বজুড়ে ছড়িয়ে থাকা 250,000 এরও বেশি সন্তুষ্ট শিক্ষার্থীর নেটওয়ার্ক সহ একটি বিশ্বস্ত অনলাইন লার্নিং সংস্থা এডুরেকা দ্বারা। আমরা আপনার যাতায়াতের প্রতিটি পদক্ষেপে আপনাকে সহায়তা করতে এখানে এই জাভা সাক্ষাত্কারের প্রশ্নগুলির পাশাপাশি হয়ে উঠার জন্য আমরা একটি পাঠ্যক্রম নিয়ে এসেছি যা জাভা ডেভেলপার হতে চান এমন শিক্ষার্থী এবং পেশাদারদের জন্য তৈরি করা হয়েছে।
আমাদের জন্য একটি প্রশ্ন আছে? দয়া করে এটি 'জাভাতে সিঙ্ক্রোনাইজেশন' এর মন্তব্য বিভাগে উল্লেখ করুন ' নিবন্ধ এবং আমরা যত তাড়াতাড়ি সম্ভব আপনার কাছে ফিরে আসব।