Di Jawa, pengendali i bukan atom, bermakna jika dua utas cuba menambah pembolehubah yang sama secara serentak, keputusan mungkin tidak betul. Ini kerana operasi i terdiri daripada tiga langkah berasingan:
Jika dua utas melaksanakan langkah ini secara serentak, ada kemungkinan satu utas akan membaca nilai sebelum benang yang lain telah menambahnya. Ini boleh membawa kepada kerosakan data.
Sebagai contoh, pertimbangkan kod berikut:
class Test { private static int total = 0; public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println("Total: " + total); } }
Apabila kod ini dijalankan, ia dijangka mencetak 200000, tetapi ia mungkin mencetak lebih rendah nilai disebabkan oleh sifat bukan atom pengendali i.
Untuk memastikan kod berbilang benang mengakses pembolehubah yang dikongsi secara atom, adalah perlu untuk gunakan mekanisme penyegerakan seperti kunci atau pembolehubah atom. Kata kunci yang disegerakkan boleh digunakan untuk menyegerakkan akses kepada blok kod, manakala kelas AtomicInteger menyediakan jenis integer atom.
Atas ialah kandungan terperinci Mengapa `i ` Bukan Atom di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!