Cukup catat cara menggunakan kata kunci tersinkronisasi di java.
Sebelum pendahuluan, perlu diklarifikasi bahwa setiap instance objek suatu kelas di Java memiliki dan hanya memiliki satu kunci (gembok) yang terkait dengannya. Kata kunci tersinkronisasi hanya berfungsi pada kunci ini, yaitu dapat dianggap hanya tersinkronisasi mempengaruhi instance objek dari efek kelas Java.
fungsi modifikasi yang disinkronkan
Copy kode kodenya sebagai berikut:
aMethod(){ yang disinkronkan secara publik
}
Ini adalah skenario yang paling umum digunakan, jadi apa tujuan dari metode sinkronisasi ini? Untuk memudahkan, ini disebut metode aMethod.
1. Kunci yang disinkronkan adalah instance objek yang memanggil metode sinkronisasi ini. Misalnya, sinkronisasi akan terjadi ketika instance P1 yang sama memanggil aMethod di thread yang berbeda;
2. Perlu dicatat bahwa objek P2 lain dari kelas tempat objek ini berada dapat memanggil aMethod ini secara sewenang-wenang, karena metode yang disinkronkan dari instance objek yang berbeda tidak saling mengganggu. Dengan kata lain, thread lain masih dapat mengakses metode aMethod di instance objek lain dari kelas yang sama pada waktu yang sama;
3. Jika suatu objek memiliki beberapa metode yang disinkronkan, seperti aMethod, bMethod, dan cMethod, sekarang selama satu thread mengakses salah satu metode yang disinkronkan, thread lain tidak dapat mengakses metode tersinkronisasi apa pun di objek secara bersamaan.
Kode di atas sebenarnya setara dengan berikut ini:
Copy kode kodenya sebagai berikut:
kekosongan publik aMetode() {
disinkronkan (ini) {
}
}
Ini di sini mengacu pada referensi objek instance, seperti P1. Terlihat inti dari metode sinkronisasi adalah menerapkan sinkronisasi pada objek referensi. Hanya thread yang telah memperoleh kunci objek P1 yang dapat memanggil metode sinkronisasi P1. Sejauh menyangkut P2, kunci P1 tidak ada hubungannya dengan itu. Program ini juga dapat menghilangkan kendali mekanisme sinkronisasi dalam hal ini situasi, menyebabkan kebingungan data. Dari sini kami memperoleh blok sinkronisasi di bawah ini.
blok kode yang dimodifikasi dan disinkronkan
Copy kode kodenya sebagai berikut:
public void dMethod(SomeObject jadi) {
disinkronkan(jadi) {
}
}
Kunci yang diperoleh dengan sinkronisasi di sini adalah kunci dari objek jadi, jadi siapa pun yang mendapatkan kunci tersebut dapat menjalankan kode yang dikontrolnya. Ketika ada objek yang jelas sebagai kunci, Anda dapat menulis program seperti ini, tetapi ketika tidak ada objek yang jelas sebagai kunci dan Anda hanya ingin menyinkronkan sepotong kode, Anda dapat membuat variabel instan khusus (harus sebuah objek) untuk bertindak sebagai kunci:
Copy kode kodenya sebagai berikut:
kelas Foo mengimplementasikan Runnable {
byte pribadi[] kunci = byte baru[0];
Metode kekosongan publik() {
disinkronkan (kunci) {
}
}
}
Objek array byte dengan panjang nol akan lebih hemat biaya untuk dibuat dibandingkan objek lainnya.
metode statis yang dimodifikasi dan disinkronkan
Seperti disebutkan sebelumnya, kata kunci yang disinkronkan hanya berlaku untuk contoh P1 di thread yang berbeda. Jadi bagaimana kata kunci tersebut bisa valid untuk contoh P1 dan P2 yang berbeda secara bersamaan? Jawabannya adalah dengan menggunakan sinkronisasi untuk memodifikasi metode statis suatu kelas dapat dikatakan dimiliki oleh kelas ini. Itu tidak bergantung pada instance kelas tersebut, jadi kita hanya perlu menggunakan kata kunci sinkronisasi untuk memodifikasi metode statis kelas tersebut untuk mencapai sinkronisasi antara instance yang berbeda.