Di Jawa, variabel dasar lainnya adalah atom, kecuali variabel 8-byte, 64-bit dari Long dan Double.
Model penyimpanan Java mengharuskan operasi get dan store menjadi atomik, tetapi untuk variabel panjang dan ganda yang tidak mudah menguap, JVM memungkinkan pemisahan baca atau tulis 64-bit menjadi dua operasi 32-bit.
Jika baca dan tulis terjadi pada utas yang berbeda, membaca panjang tipe non-volatile dapat menghasilkan 32 bit tinggi dari satu nilai dan 32 bit rendah dari nilai lainnya.
Jadi, meskipun Anda tidak peduli dengan data kedaluwarsa, mungkin tidak aman untuk menggunakan variabel panjang dan ganda yang dibagikan, dapat diubah dalam program multithread kecuali jika mereka dinyatakan tidak stabil, atau dilindungi dengan kunci.
Berbicara tentang operasi atom, itu berarti bahwa membaca dan menulis bersifat atom, seperti i=5; Ini adalah operasi atom.
Namun, jika pengoperasian dua atom dilakukan bersama-sama, belum tentu atom, seperti membaca terlebih dahulu dan kemudian menulis, maka ada kemungkinan variabel tersebut telah dimodifikasi setelah membaca.
i++ adalah operasi seperti itu, baca terlebih dahulu dan kemudian tulis, jadi variabel bilangan bulat adalah atomik, bukan bahwa i++ adalah operasi atom.
Saat Anda menggunakan for(int i=0; i<10000; i++){Sistem.keluar.cetak(i)}
Anda akan menemukan bahwa saya tidak akan mencetak 10.000 pada akhirnya, dan mencetak sekitar 8-9 ribu.
Tetapi dalam kasus multi-threading, bahkan jika variabel bilangan bulat bersifat atom, mungkin ada masalah keamanan utas, yang merupakan masalah visibilitas utas, jadi Anda perlu menambahkan pernyataan volatile.
Pengubah ini adalah variabel paksa yang dibaca dari memori setiap kali dan tidak disimpan dalam register. |