জাভাতে, একটি ডেডলক ৷ একটি প্রোগ্রামিং পরিস্থিতি যেখানে দুই বা ততোধিক থ্রেড চিরতরে ব্লক করা হয় . অন্তত দুটি থ্রেড সহ একটি অচলাবস্থা ঘটবে৷ এবং দুই বা ততোধিক সম্পদ .
কীভাবে অচলাবস্থা এড়াতে হয়
- নেস্টেড লক এড়িয়ে চলুন :একটি অচলাবস্থা মূলত ঘটে যখন আমরা একাধিক থ্রেডে লক দেই। একাধিক থ্রেডে লক দেওয়া এড়িয়ে চলুন যদি আমরা ইতিমধ্যে একটিকে দিয়ে থাকি।
- অপ্রয়োজনীয় লক এড়িয়ে চলুন :আমরা একটি লক থাকতে পারে শুধুমাত্র সেই সদস্যদের যা প্রয়োজন। অপ্রয়োজনীয়ভাবে একটি লক থাকার ফলে একটি অচলাবস্থা হতে পারে।
- Thread.join(): ব্যবহার করা একটি অচল অবস্থা দেখা দেয় যখন একটি থ্রেড অন্যটি শেষ হওয়ার জন্য অপেক্ষা করে। এই অবস্থা দেখা দিলে আমরা Thread.join() ব্যবহার করতে পারি মৃত্যুদন্ড কার্যকর করতে সর্বোচ্চ সময় লাগবে।
উদাহরণ
পাবলিক ক্লাস ডেডলকটেস্ট { পাবলিক স্ট্যাটিক ভ্যাইড মেইন(স্ট্রিং[] আর্গস) ইন্টারাপ্টেড এক্সসেপশন থ্রো করে { অবজেক্ট obj1 =নতুন অবজেক্ট(); অবজেক্ট obj2 =নতুন অবজেক্ট(); অবজেক্ট obj3 =new Object(); থ্রেড t1 =নতুন থ্রেড(নতুন SyncThread(obj1, obj2), "t1"); থ্রেড t2 =নতুন থ্রেড(নতুন SyncThread(obj2, obj3), "t2"); t1.start(); Thread.sleep(2000); t2.start(); Thread.sleep(2000); }} ক্লাস SyncThread প্রয়োগ করে রানযোগ্য { ব্যক্তিগত অবজেক্ট অবজেক্ট 1; ব্যক্তিগত বস্তু obj2; সর্বজনীন SyncThread(অবজেক্ট o1, অবজেক্ট o2){ this.obj1=o1; this.obj2=o2; } @Override public void run() { স্ট্রিং নাম =Thread.currentThread().getName(); System.out.println(নাম + "" + obj1 এ লক অর্জন করা); সিঙ্ক্রোনাইজড (obj1) { System.out.println(নাম + " অর্জিত লক " + obj1); কাজ(); } System.out.println(নাম + " " + obj1 এ লক প্রকাশ করা হয়েছে); System.out.println(নাম + "" + obj2 এ লক অর্জন করা); সিঙ্ক্রোনাইজ করা (obj2) { System.out.println(নাম + "" + obj2 এ অর্জিত লক); কাজ(); } System.out.println(নাম + " " + obj2 এ লক প্রকাশ করা হয়েছে); System.out.println(নাম + "সম্পাদনা সমাপ্ত।"); } ব্যক্তিগত অকার্যকর কাজ() { চেষ্টা করুন { Thread.sleep(5000); } ধরা (InterruptedException ie) { ie.printStackTrace(); } } }