এখানে একটি উদাহরণ রয়েছে, কারণ একটি উদাহরণ দীর্ঘ ব্যাখ্যার চেয়ে প্রায়শই পরিষ্কার হয়। ধরুন foo
টাইপের একটি ভেরিয়েবল long
। নিম্নলিখিত অপারেশন কোনও পারমাণবিক অপারেশন নয়:
foo = 65465498L;
প্রকৃতপক্ষে, দুটি পৃথক ক্রিয়াকলাপ ব্যবহার করে চলকটি লেখা হয়: একটি যা প্রথম 32 টি বিট লিখে এবং দ্বিতীয়টি যা সর্বশেষ 32 টি বিট লেখেন। এর অর্থ হ'ল অন্য থ্রেডের মান পড়তে পারে foo
এবং মধ্যবর্তী অবস্থা দেখতে পারে।
অপারেশন পারমাণবিক করা অপারেশনটি অন্য কোনও থ্রেড থেকে একক, পারমাণবিক (অর্থাৎ অংশে বিভক্ত নয়) অপারেশন হিসাবে দেখা যায় কিনা তা নিশ্চিত করার জন্য সিঙ্ক্রোনাইজেশন পদ্ধতি ব্যবহার করে। এর অর্থ হ'ল অপারেশনটি একবার পারমাণবিক হয়ে গেলে অন্য কোনও থ্রেড foo
অ্যাসাইনমেন্টের আগে, বা অ্যাসাইনমেন্টের পরে মানটি দেখতে পাবে । তবে কখনও অন্তর্বর্তী মান হয় না।
এটি করার একটি সহজ উপায় হ'ল পরিবর্তনশীলটিকে অস্থির করে তোলা :
private volatile long foo;
অথবা ভেরিয়েবলের প্রতিটি অ্যাক্সেস সিঙ্ক্রোনাইজ করতে:
public synchronized void setFoo(long value) {
this.foo = value;
}
public synchronized long getFoo() {
return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized
বা এটির সাথে প্রতিস্থাপন করতে AtomicLong
:
private AtomicLong foo;