Rumah  >  Artikel  >  Java  >  Apakah yang dilakukan oleh model memori Java?

Apakah yang dilakukan oleh model memori Java?

王林
王林ke hadapan
2023-05-09 09:01:211145semak imbas

Apakah itu JMM

  • Nama penuh JMM ialah Java Memory Model, terjemahan Cina ialah Java Memory Model, model memori yang mematuhi spesifikasi model memori dan melindungi perbezaan akses pelbagai perkakasan dan sistem pengendalian , memastikan program Java boleh memastikan mekanisme dan spesifikasi yang konsisten apabila mengakses memori pada pelbagai platform.

  • Model memori Java menetapkan bahawa semua pembolehubah disimpan dalam memori utama, dan setiap thread mempunyai memori kerjanya sendiri.

  • Memori kerja benang menyimpan salinan memori utama pembolehubah yang digunakan dalam utas Semua operasi pada pembolehubah oleh utas mesti dilakukan dalam memori kerja Ia tidak boleh membaca dan menulis memori utama secara langsung.

  • Benang yang berbeza tidak boleh mengakses terus pembolehubah dalam memori kerja masing-masing Pemindahan pembolehubah antara utas memerlukan penyegerakan data antara memori kerja mereka sendiri dan memori utama.

  • JMM bertanggungjawab untuk proses penyegerakan data antara memori kerja dan ingatan utama. Dia menentukan bagaimana dan bila penyegerakan data dilakukan.

Apakah yang dilakukan oleh model memori Java?

Memori utama dan memori kerja

  • Memori utama dan memori kerja boleh dibandingkan dengan komputer Konsep ingatan utama dan cache dalam model ingatan. Adalah penting untuk ambil perhatian bahawa ingatan utama dan ingatan kerja tidak berada pada tahap pembahagian memori yang sama seperti timbunan, timbunan, kawasan kaedah, dll. Java dalam struktur memori JVM dan tidak boleh dibandingkan secara langsung.

  • Jika anda terpaksa memadankannya dengan berat hati, daripada takrif pembolehubah, ingatan utama dan ingatan kerja, ingatan utama terutamanya sepadan dengan bahagian data contoh objek dalam timbunan Java. Memori kerja sepadan dengan sebahagian daripada timbunan mesin maya.

Apakah kegunaan kata kunci yang tidak menentu

  • Pastikan keterlihatan memori data

  • Keterlihatan

    Pembolehubah awal mula-mula disimpan dalam ingatan utama;

    Pembolehubah operasi benang perlu disalin dari memori utama ke memori tempatan utas; ialah konsep abstrak, termasuk cache, penimbal stor (akan dibincangkan kemudian), daftar, dsb.

  • Jika thread A dan thread B ingin berkomunikasi, mereka mesti melalui dua langkah berikut:

    Thread A menyimpan memori tempatan A dalam Pembolehubah kongsi yang dikemas kini dibuang ke memori utama.

    Benang B pergi ke memori utama untuk membaca pembolehubah kongsi yang telah dikemas kini oleh urutan A sebelum ini.

  • Selepas satu utas mengubah suai pembolehubah yang dikongsi, utas lain boleh melihat (melihat) pengubahsuaian (perubahan) pembolehubah

    Ini benar untuk kedua-dua pembolehubah biasa dan pembolehubah tidak menentu
    • Perbezaannya ialah: peraturan khas meruap memastikan bahawa nilai baharu selepas nilai pembolehubah meruap diubah suai serta-merta disegerakkan ke memori utama , pembolehubah tidak menentu dimuatkan semula daripada memori utama sejurus sebelum setiap penggunaan, jadi tidak menentu menjamin keterlihatan pembolehubah operasi antara berbilang utas, manakala pembolehubah biasa tidak dapat menjamin ini.
    Selain kata kunci yang tidak menentu yang boleh mencapai keterlihatan, disegerakkan, Kunci dan
  • akhir (tidak berubah)

    juga mungkin Gunakan kata kunci yang disegerakkan, pada permulaan kaedah penyegerakan/blok penyegerakan (Monitor Enter), apabila menggunakan pembolehubah yang dikongsi, nilai pembolehubah akan dimuat semula dari memori utama ke memori kerja (iaitu, nilai terkini akan dibaca daripada memori utama ke memori kerja persendirian utas), pada penghujung kaedah penyegerakan/blok penyegerakan (Monitor Exit), nilai pembolehubah dalam memori kerja akan disegerakkan ke memori utama (iaitu, nilai ​​​​dalam memori kerja peribadi benang akan ditulis pada memori utama untuk penyegerakan) .

    Gunakan pelaksanaan antara muka Lock yang paling biasa digunakan, ReentrantLock (kunci reentrant), untuk mencapai keterlihatan: Apabila kita melaksanakan kaedah lock.lock() pada permulaan kaedah, ini adalah sama dengan kedudukan permulaan yang disegerakkan (Monitor Enter) Mereka mempunyai semantik yang sama, iaitu, apabila menggunakan pembolehubah yang dikongsi, nilai pembolehubah akan dimuat semula daripada memori utama ke memori kerja (iaitu, nilai terkini akan dibaca dari memori utama ke memori kerja peribadi benang), dan kunci akan dilaksanakan dalam blok akhir kaedah .unlock() mempunyai semantik yang sama seperti kedudukan akhir yang disegerakkan (Monitor Exit), iaitu, ia akan menyegerakkan nilai pembolehubah dalam memori kerja ke memori utama (iaitu, tulis nilai dalam memori kerja peribadi benang ke ingatan utama).

    Keterlihatan kata kunci akhir merujuk kepada: pembolehubah diubah suai oleh muktamad, setelah dimulakan dalam pembina, dan rujukan kepada "ini" tidak dipadamkan dalam pembina (rujukan "ini" Melarikan diri sangat berbahaya , utas lain berkemungkinan mengakses objek yang hanya "separuh dimulakan" melalui rujukan ini), kemudian utas lain boleh melihat nilai pembolehubah akhir.

Atas ialah kandungan terperinci Apakah yang dilakukan oleh model memori Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam