আমি জানি যে যৌগিক ক্রিয়াকলাপগুলি যেমন i++
থ্রেড নিরাপদ নয় কারণ তারা একাধিক ক্রিয়াকলাপ জড়িত ।
কিন্তু রেফারেন্সটি নিজেই একটি থ্রেড নিরাপদ অপারেশনটি পরীক্ষা করছে?
a != a //is this thread-safe
আমি এটি প্রোগ্রাম করার এবং একাধিক থ্রেড ব্যবহার করার চেষ্টা করেছি কিন্তু এটি ব্যর্থ হয়নি। আমার ধারণা আমি আমার মেশিনে রেস অনুকরণ করতে পারিনি could
সম্পাদনা করুন:
public class TestThreadSafety {
private Object a = new Object();
public static void main(String[] args) {
final TestThreadSafety instance = new TestThreadSafety();
Thread testingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
long countOfIterations = 0L;
while(true){
boolean flag = instance.a != instance.a;
if(flag)
System.out.println(countOfIterations + ":" + flag);
countOfIterations++;
}
}
});
Thread updatingReferenceThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
instance.a = new Object();
}
}
});
testingReferenceThread.start();
updatingReferenceThread.start();
}
}
এই প্রোগ্রামটি আমি থ্রেড-সুরক্ষা পরীক্ষা করতে ব্যবহার করছি।
অদ্ভুত আচরণ
আমার প্রোগ্রামটি কিছু পুনরাবৃত্তির মধ্যে শুরু হওয়ার সাথে সাথে আমি আউটপুট ফ্ল্যাগের মান পাই, যার অর্থ রেফারেন্স !=
চেক একই রেফারেন্সে ব্যর্থ। কিন্তু কিছু পুনরাবৃত্তির পরে আউটপুট স্থির মান হয়ে যায় false
এবং তারপরে দীর্ঘ সময় ধরে প্রোগ্রাম চালানো কোনও একক true
আউটপুট তৈরি করে না ।
আউটপুটটি কিছু এন (স্থির নয়) পুনরাবৃত্তির পরে যেমন প্রস্তাব দেয় তবে আউটপুট স্থির মান বলে মনে হয় এবং এটি পরিবর্তন হয় না।
আউটপুট:
কিছু পুনরাবৃত্তির জন্য:
1494:true
1495:true
1496:true
19970:true
19972:true
19974:true
//after this there is not a single instance when the condition becomes true
1234:true
কখনই একে অপরের উপর আঘাত না করে ) নোট করুন । একটি রেস টেস্টের জন্য আরও কঠোর অভ্যন্তরীণ লুপ দরকার। শেষে একটি সংক্ষিপ্তসার মুদ্রণ করুন (যেমন কেউ একটি ইউনিট পরীক্ষার কাঠামোর সাথে নীচে করেছেন)।