Apa arti monitor objek di Java? Mengapa menggunakan kata ini?

87

Saat membaca artikel tentang utas Java, saya sering melihat ungkapan: "utas saat ini adalah pemilik monitor objek ini". Saya mengerti artinya: utas mendapat hak untuk beroperasi pada objek. Tapi saya bingung mengapa kita menggunakan frase "monitor objek" daripada "kunci objek"?

Singkatnya, saya tidak tahu arti kata 'monitor'. Pertanyaannya mungkin aneh dan sederhana. Tapi saya berharap ada yang bisa membantu menyelesaikannya. 3k

jiafu
sumber
1
+1 @ulmangt karena menjadi satu-satunya yang benar-benar menjawab pertanyaan Anda: Kami menyebutnya "monitor" karena itulah yang disebut Hoare pada tahun 1974.
Solomon Slow

Jawaban:

52

tapi saya bingung kenapa menggunakan kata "monitor objek" sebagai contoh "kunci objek"?

Lihat jawaban ulmangt untuk link yang menjelaskan istilah "monitor" seperti yang digunakan dalam konteks ini. Perhatikan bahwa:

"Monitor diciptakan oleh Per Brinch Hansen dan CAR Hoare, dan pertama kali diterapkan dalam bahasa Pascal Bersamaan dengan Brinch Hansen."

(Sumber: Wikipedia )

Mengapa menggunakan istilah "monitor" daripada "kunci"? Sebenarnya, istilah tersebut memiliki arti yang berbeda ... terutama jika Anda menggunakannya dengan cara yang semula dimaksudkan untuk digunakan.

  • Sebuah "kunci" adalah sesuatu dengan primitif perolehan dan rilis yang mempertahankan properti kunci tertentu; misalnya penggunaan eksklusif atau penulis tunggal / banyak pembaca.

  • Sebuah "monitor" adalah mekanisme yang memastikan bahwa hanya satu thread yang dapat mengeksekusi bagian (atau bagian) kode tertentu pada waktu tertentu. Ini dapat diimplementasikan menggunakan kunci (dan "variabel kondisi" yang memungkinkan utas menunggu atau mengirim pemberitahuan ke utas lain bahwa kondisi terpenuhi), tetapi ini lebih dari sekadar kunci. Memang, dalam kasus Java, kunci sebenarnya yang digunakan oleh monitor tidak dapat diakses secara langsung. (Anda tidak bisa mengatakan "Object.lock ()" untuk mencegah thread lain memperolehnya ... seperti yang Anda bisa dengan Lockinstance Java .)

Singkatnya, jika seseorang harus bertele-tele, "monitor" sebenarnya adalah istilah yang lebih baik daripada "kunci" untuk menggambarkan apa yang disediakan oleh Java. Namun dalam praktiknya, kedua istilah tersebut digunakan hampir secara bergantian.

Stephen C
sumber
10

Kutipan dari Inside the Java Virtual Machine

Sebuah utas di mesin virtual Java meminta kunci saat tiba di awal wilayah monitor. Di Jawa, ada dua jenis wilayah monitor: pernyataan tersinkronisasi dan metode tersinkronisasi.

Pantau

Monitor seperti sebuah bangunan yang berisi satu ruangan khusus yang hanya dapat ditempati oleh satu thread pada satu waktu. Ruangan biasanya berisi beberapa data. Sejak utas memasuki ruangan ini hingga keluar, utas memiliki akses eksklusif ke data apa pun di dalam ruangan. Memasuki gedung monitor disebut "memasuki monitor". Memasuki ruangan khusus di dalam gedung disebut "memperoleh monitor". Menempati ruangan disebut "memiliki monitor", dan meninggalkan ruangan disebut "melepaskan monitor". Meninggalkan seluruh gedung disebut "keluar dari monitor".

Selain dikaitkan dengan sedikit data, monitor dikaitkan dengan satu atau lebih bit kode, yang dalam buku ini disebut wilayah monitor.

Seperti disebutkan sebelumnya, bahasa ini menyediakan dua cara bawaan untuk mengidentifikasi wilayah monitor di program Anda: pernyataan tersinkronisasi dan metode tersinkronisasi. Kedua mekanisme ini, yang mengimplementasikan aspek pengecualian timbal balik dari sinkronisasi, didukung oleh set instruksi mesin virtual Java.

Mengunci

Untuk mengimplementasikan kapabilitas pengecualian timbal balik dari monitor, mesin virtual Java mengaitkan kunci (kadang disebut mutex) dengan setiap objek dan kelas. Kunci adalah seperti hak istimewa yang hanya dapat "dimiliki" satu utas pada satu waktu.

Untaian tunggal diizinkan untuk mengunci objek yang sama beberapa kali. Untuk setiap objek, mesin virtual Java menghitung berapa kali objek telah dikunci. Objek yang tidak terkunci memiliki hitungan nol. Saat utas memperoleh kunci untuk pertama kalinya, hitungannya lagi bertambah menjadi satu. Setiap kali utas mendapatkan kunci pada objek yang sama, hitungannya bertambah lagi.

Zane XY
sumber
6

Sebuah synchronizedblok di sekitar objectmonitornya, yang mengontrol kunci pada objek. Berikut contohnya

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}
abbas
sumber
4

Meskipun terlambat untuk menjawab pertanyaan ini, saya pikir untuk menambahkan seandainya itu berguna.
Berikut adalah blok kode Java yang disinkronkan di dalam metode Java yang tidak tersinkronisasi

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

Dalam contoh "ini" digunakan, yang merupakan contoh tempat metode add dipanggil. Metode instance tersinkronisasi menggunakan objek yang dimilikinya sebagai objek monitor.
=> Hanya satu utas yang dapat mengeksekusi di dalam blok kode Java yang disinkronkan pada objek monitor yang sama.

Seorang pria
sumber
3

Mesin Virtual Java menggunakan monitor untuk mendukung multithreading. Monitor mencapai hal ini melalui dua konsep - Saling pengecualian saat menjalankan utas (di sinilah 'penguncian' muncul) dan koordinasi sebagai sarana komunikasi antar utas (di sinilah metode tunggu dan beri tahu objek muncul).

Membaca bagian berikut dari "Inside JVM" akan menghilangkan keraguan ini, apakah dijelaskan dengan sangat baik di sini (Bab 20, Sinkronisasi thread) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

adityalad
sumber