Terkadang optimalisasi kompiler dan prosesor akan menyebabkan runtime berbeda dari apa yang kami bayangkan. Untuk alasan ini, Java telah memberlakukan beberapa pembatasan pada kompiler dan prosesor. Java Memory Model (JMM) mengabstraksi ini sehingga tidak perlu mempertimbangkan begitu banyak detail yang mendasarinya saat menulis kode, dan memastikan bahwa "selama Anda mengikuti aturan JMM untuk menulis program, hasil berjalan harus benar."
Struktur abstrak JMM
Di Java, semua instance dan variabel statis disimpan dalam memori heap, yang dapat dibagi antara utas, dan bagian ini juga disebut variabel bersama . Variabel lokal, parameter definisi metode, dan parameter penanganan pengecualian ada di tumpukan, dan memori tumpukan tidak dibagi di antara utas.
Namun, karena optimalisasi kompiler dan prosesor, akan ada masalah visibilitas dengan variabel bersama. Misalnya, dalam multi-prosesor, utas dapat dieksekusi pada prosesor yang berbeda, dan cache yang tidak konsisten antara prosesor akan menyebabkan masalah visibilitas dengan variabel bersama . Ada kemungkinan bahwa dua utas melihat nilai yang berbeda dari variabel yang sama.
JMM Abstrak Optimalisasi yang dibuat oleh perangkat keras ini ke dalam setiap utas memiliki memori lokal. Ketika Anda perlu membaca dan menulis variabel bersama, salin salinan dari memori utama ke memori lokal. Saat menulis variabel bersama, tuliskan ke memori lokal terlebih dahulu, dan kemudian menyegarkannya ke memori utama di suatu waktu di masa depan. Ketika variabel bersama dibaca lagi, itu hanya akan dibaca dari memori lokal.
Dengan cara ini, komunikasi antara utas membutuhkan dua langkah:
Tulis utas: Segarkan memori lokal dan baca utas: Baca nilai yang diperbarui dari memori utama
Dengan cara ini, ada penundaan antara menulis dan membaca: Kapan memori lokal akan disegarkan ke memori utama? Hal ini menyebabkan masalah visibilitas, dan utas yang berbeda dapat melihat variabel bersama yang berbeda.
terjadi sebelum
Secara harfiah terjadi sebelumnya berarti "sebelum terjadi sebelum ini". Ini adalah aturan yang dirumuskan Java atas urutan eksekusi program, dan sinkronisasi harus diikuti. Dengan cara ini, programmer hanya perlu menulis program sinkron yang benar, dan terjadi setelah memastikan bahwa hasil berjalan tidak akan salah.
A yang terjadi sebelum B tidak hanya berarti bahwa A dieksekusi sebelum B, tetapi juga berarti bahwa hasil eksekusi A terlihat oleh B, yang memastikan visibilitas.
A yang terjadi sebelum B, A tidak harus dieksekusi sebelum B. Jika AB alternatif dan hasil eksekusi masih benar, kompiler dan prosesor diizinkan untuk mengoptimalkan pemesanan ulang. Jadi selama hasil program benar, tidak ada masalah dengan bagaimana kompiler dan prosesor mengoptimalkan dan memesan ulang, dan semuanya baik.
terjadi aturan sebelum
Aturan Urutan Program: Di utas, aturan kunci operasi setelah operasi sebelumnya terjadi sebelum: untuk kunci yang sama, Buka Kunci terjadi sebelum dan kunci aturan domain yang mudah menguap: Tulis variabel volatile, dan baca salah satu variabel volatile setelah terjadi sebelum sebelumnya. Transitiveness of the operation: A happens-before B, B happens-before C, then A happens-before C start() rules: If thread A executes ThreadB.start() then ThreadB.start() happens-before Any operation join() rules in thread B: If thread A executes ThreadB.join(), then all operations in thread B happens-before ThreadB.join() happens-before
Contoh berikut membantu memahami terjadi sebelum
PI ganda = 3.14; // Adouble r = 1.0; // area bdouble = pi * r * r; //C
Berikut adalah tiga hubungan yang terjadi sebelum, Aturan 1 dan 2 adalah aturan pesanan program, dan aturan 3 berasal dari aturan transitif:
A terjadi sebelum bb terjadi sebelum terjadi sebelum c
C tergantung pada A dan B, tetapi A maupun B tidak bergantung padanya. Jadi, bahkan jika A dan B disusun ulang, hasil eksekusi tidak akan berubah. Dalam pemesanan ulang ini, JMM sedang berjalan.
Dua urutan eksekusi berikut sudah benar.
Di atas adalah semua konten yang telah kami kumpulkan untuk Anda tentang belajar model memori java jmm. Untuk pertanyaan lebih lanjut, silakan tinggalkan pesan di bawah ini untuk dibahas. Terima kasih atas dukungan Anda untuk wulin.com.