থ্রেডিংয়ের বিষয়ে উচ্চ স্তরের জাভা ক্লাসে আমার শিক্ষক এমন কিছু বলেছেন যা সম্পর্কে আমি নিশ্চিত নই।
তিনি বলেছিলেন যে নিম্নলিখিত কোডগুলি অগত্যা ready
পরিবর্তনশীলটিকে আপডেট করবে না । তাঁর মতে, দুটি থ্রেড অগত্যা স্ট্যাটিক ভেরিয়েবল ভাগ করে না, বিশেষত যখন প্রতিটি থ্রেড (মূল থ্রেড বনাম ReaderThread
) তার নিজস্ব প্রসেসরে চলছে এবং সুতরাং একই রেজিস্টার / ক্যাশে / ইত্যাদি ভাগ করে না এবং একটি সিপিইউ করে অন্য আপডেট করবেন না।
মূলত, তিনি বলেছিলেন যে ready
মূল থ্রেডে এটি আপডেট করা সম্ভব , তবে এতে নেই ReaderThread
, যাতে ReaderThread
অসীম লুপ হয়ে যায়।
তিনি দাবি করেছিলেন যে প্রোগ্রামটি মুদ্রণ করা সম্ভব হয়েছিল 0
বা 42
। আমি বুঝতে পারি কীভাবে 42
মুদ্রিত হতে পারে, তবে না 0
। তিনি উল্লেখ করেছিলেন যে যখন number
ভেরিয়েবলটি ডিফল্ট মানকে সেট করা হয় তখন এটি হবে ।
আমি ভেবেছিলাম সম্ভবত এটি গ্যারান্টিযুক্ত নয় যে থ্রেডগুলির মধ্যে স্ট্যাটিক ভেরিয়েবল আপডেট হয়েছে তবে জাভাটির জন্য এটি আমাকে খুব বিজোড় বলে মনে করে। ready
অস্থির করে তোলে কি এই সমস্যাটিকে সংশোধন করে?
তিনি এই কোডটি দেখিয়েছেন:
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready) Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}