1. Model Memori Java (JMM)
Artikel yang dibawakan oleh editor PHP Banana akan meneroka secara mendalam model memori Java dan keteraturan, dan mendedahkan tingkah laku penyusunan semula arahan dalam pengaturcaraan berbilang benang. Dalam pengaturcaraan berbilang benang, penyusunan semula arahan boleh membawa kepada hasil yang tidak dijangka dalam atur cara Memahami model memori Java dan pesanan adalah penting untuk mengelakkan masalah ini. Artikel ini akan menerangkan secara terperinci prinsip dan kesan penyusunan semula arahan untuk membantu pembaca memahami dengan lebih baik bahaya dan penyelesaian tersembunyi dalam pengaturcaraan berbilang benang.
2
JMM mentakrifkan susunan pelaksanaan arahan dalam program. Keteraturan bermaksud susunan pelaksanaan arahan dalam atur cara adalah konsisten dengan susunan kod sumber program. JMM menjamin jenis tempahan berikut:
- Keteraturan program:Tertib pelaksanaan arahan dalam program adalah konsisten dengan susunan kod sumber program.
- Keteraturan penyata:Tertib pelaksanaan arahan dalam penyata adalah konsisten dengan susunan kod sumber penyata.
- Keteraturan penyegerakan: Susunan pelaksanaan arahan dalam blok atau kaedah yang disegerakkan adalah konsisten dengan susunan kod sumber bagi blok atau kaedah yang disegerakkan.
3. Perintah menyusun semula
Untuk meningkatkan prestasi, pemproses boleh menyusun semula susunan pelaksanaan arahan. Penyusunan semula ini tidak mengubah keputusan akhir program, tetapi mungkin menyebabkan program berbilang benang berkelakuan berbeza daripada yang dijangkakan.
Penyusunan semula arahan boleh menyebabkan masalah berikut:
- Masalah keterlihatan: Thread A menulis kepada pembolehubah yang dikongsi, tetapi thread B tidak melihat operasi tulis ini.
- Masalah atomicity: Thread A melakukan operasi atom pada pembolehubah yang dikongsi, tetapi hasil operasi yang dilihat oleh thread B bukan atom.
4. Bagaimana untuk mengelakkan masalah pesanan semula arahan
Untuk mengelakkan masalah penyusunan semula arahan, anda boleh menggunakan kaedah berikut:
- Gunakan kata kunci yang tidak menentu: Kata kunci yang tidak menentu menghalang arahan daripada menyusun semula akses kepada pembolehubah yang dikongsi.
- Gunakan kata kunci yang disegerakkan: Kata kunci yang disegerakkan boleh memaksa benang untuk melaksanakan blok kod mengikut susunan.
- Gunakan operasi atom: Operasi atom boleh memastikan bahawa operasi pada pembolehubah yang dikongsi adalah atom.
5. Kod demo
Kod berikut menunjukkan masalah yang mungkin disebabkan oleh penyusunan semula arahan:
public class ReorderingDemo {
private static int x = 0;
private static int y = 0;
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
x = 1;
y = 1;
});
Thread thread2 = new Thread(() -> {
if (y == 1) {
System.out.println("x is " + x);
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
Salin selepas log masuk
Dalam kod ini, utas 1 mula-mula menetapkan nilai x dan y kepada 1, kemudian utas 2 menyemak sama ada nilai y ialah 1, dan jika ya, mencetak nilai x. Jika pemproses menyusun semula arahan dalam utas 1, utas 2 mungkin melihat nilai y sebagai 1 sebelum x ditetapkan kepada 1, sekali gus mencetak 0.
6. Kesimpulan
Model memori Java mentakrifkan keterlihatan dan atomicity antara pembolehubah dalam pengaturcaraan berbilang benang. Keteraturan bermaksud susunan pelaksanaan arahan dalam atur cara adalah konsisten dengan susunan kod sumber program. Penyusunan semula arahan boleh menyebabkan program berbilang benang berkelakuan berbeza daripada yang dijangkakan. Untuk mengelakkan isu penyusunan semula arahan, anda boleh menggunakan kata kunci yang tidak menentu, kata kunci disegerakkan dan operasi atom.
Atas ialah kandungan terperinci Model dan Susunan Memori Java: Mendedahkan Gelagat Susunan Semula Arahan dalam Pengaturcaraan Berbilang Thread. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!