นี่คือตัวอย่างเนื่องจากตัวอย่างมักชัดเจนกว่าคำอธิบายที่ยาว สมมติว่าเป็นตัวแปรประเภท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;