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

Mengapa `i ` Bukan Atom di Jawa?

DDD
Lepaskan: 2024-11-26 14:48:11
asal
475 orang telah melayarinya

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);
  }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan