Visibilitas konkurensi Java

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.


person DPM    schedule 29.07.2015    source sumber
comment
Apa yang Anda maksud dengan visibilitas memori?   -  person ControlAltDel    schedule 29.07.2015
comment
Satu utas untuk mengubah variabel dan utas lainnya tidak melihat perubahan ini. Maaf, jika saya tidak menggunakan terminal yang tepat.   -  person DPM    schedule 29.07.2015
comment
Saya tidak tahu jawabannya, tapi saya harus bertanya: apa bedanya? Jika Anda mengetahui bahwa program multi-thread yang berjalan pada mesin inti tunggal tidak akan terpengaruh oleh bug konkurensi seperti ketika dijalankan pada banyak inti, apakah Anda akan melanjutkan dan menulis kode buggy? Saya tidak cukup tahu tentang prosesor dan implementasi JVM, tetapi bahkan dalam satu inti, sepertinya data yang diambil dari memori utama ke cache dapat dibatalkan sebelum dibaca, sehingga menciptakan masalah visibilitas pada satu inti.   -  person erickson    schedule 29.07.2015
comment
Saya ingin mengetahuinya, karena ini akan membantu saya memahami cara kerjanya. Kode saya tidak akan bergantung pada ini.   -  person DPM    schedule 30.07.2015


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.

person Jose Martinez    schedule 29.07.2015
comment
Sebenarnya saya tidak menyangka bahwa setiap thread memiliki cache masing-masing, tidak hanya core yang berbeda. Terima kasih ! - person DPM; 30.07.2015

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

person ControlAltDel    schedule 29.07.2015
comment
Visibilitas adalah istilah umum, yang digunakan dalam Spesifikasi Bahasa Java dan di tempat lain. - person erickson; 29.07.2015
comment
Dan bisakah Anda memberikan contoh pembaruan pada tumpukan yang terlihat oleh thread lain? Hanya ada variabel lokal, yang terbatas pada tumpukan, dan bidang, yang ada di tumpukan, jadi saya tidak mengerti pembaruan apa yang Anda maksud. - person erickson; 29.07.2015
comment
Implementasi threading tingkat rendah mungkin meninggalkan beberapa variabel tidak sepenuhnya berada di tumpukan atau heap. Mereka mungkin disimpan dalam register yang hanya terlihat oleh thread. Intinya adalah Anda benar-benar tidak tahu, dan harus berasumsi bahwa konkurensi memerlukan sinkronisasi yang sesuai, daripada membuat asumsi tentang lingkungan eksekusi Anda. - person Daniel; 29.07.2015
comment
Sesuatu seperti bingkai tumpukan asli? Itu masuk akal. - person erickson; 29.07.2015