Saya punya pertanyaan tentang visibilitas di java. Visibilitas hanya dapat muncul jika kita memiliki setidaknya dua thread, yang berjalan pada setidaknya 2 core cpu. Benar kan? Setiap inti dapat melakukan cache variabel dalam register dan memori cache dan karena itu masalah visibilitas dapat muncul. Tetapi bagaimana jika kita memiliki n thread dan semuanya berjalan dalam satu inti cpu (tentu saja, kita tidak dapat memastikan bahwa thread tersebut hanya akan berjalan pada 1 inti, tetapi berasumsi bahwa hal tersebut dapat dicapai), maka tidak ada cara untuk melakukannya. memiliki visibilitas memori? Atau ini tidak benar? Terima kasih sebelumnya.
Visibilitas konkurensi Java
Jawaban (2)
Jika berdasarkan visibilitas Anda mengacu pada memori bersama, sehingga objek yang dibuat atau diubah di satu thread dapat terlihat di thread lain, maka tidak peduli berapa banyak inti yang ada, visibilitasnya akan tetap sama. Java membuat janji sesuai dengan Spesifikasi Bahasa Java, khususnya Model Memori Java, yang harus diikuti berapa pun jumlah inti.
Tetapi bagaimana jika kita memiliki n thread dan semuanya berjalan dalam satu inti cpu (tentu saja, kita tidak dapat memastikan bahwa thread tersebut hanya akan berjalan pada 1 inti, tetapi berasumsi bahwa hal tersebut dapat dicapai), maka tidak ada cara untuk melakukannya. memiliki visibilitas memori? Atau ini tidak benar?
Ya visibilitas (memori bersama) masih ada jika ada n thread yang berjalan pada satu inti. Namun ada beberapa peringatan yang tetap ada terlepas dari berapa banyak inti. Terutama bahwa setiap thread memiliki memori cache sendiri dan suatu variabel mungkin memiliki nilai berbeda di kedua thread. Jika variabelnya adalah volatile
, maka nilai variabel tersebut akan selalu diperbarui di semua thread.
Sebuah bidang dapat dinyatakan mudah menguap, dalam hal ini Model Memori Java memastikan bahwa semua thread melihat nilai yang konsisten untuk variabel tersebut (ยง17.4).
Saya sarankan Anda membaca lebih lanjut tentang Model Memori Java.
Bahkan pada 1 inti yang menjalankan banyak thread, Anda masih dapat mengalami apa yang Anda sebut masalah "visibilitas", karena thread yang telah memuat nilai dari memori ke dalam register akan menyimpan nilai ini ke tumpukan thread tersebut, dan tidak akan melihat pembaruan jika thread dimatikan kemudian dihidupkan kembali kecuali variabel/memori dideklarasikan volatile