Rumah >Java >javaTutorial >Mengapa `i ` Bukan Atom di Jawa?

Mengapa `i ` Bukan Atom di Jawa?

DDD
DDDasal
2024-11-26 14:48:11483semak imbas

Why Isn't `i  ` Atomic in Java?

Mengapa i Bukan Atom di Jawa?

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:

  1. Membaca nilai semasa pembolehubah
  2. Menambah nilai
  3. Menulis nilai baharu kembali ke pembolehubah

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn