Dokumentasi Java mengatakan:
Tidak mungkin untuk dua pemanggilan metode yang disinkronkan pada objek yang sama untuk interleave.
Apa artinya ini untuk metode statis? Karena metode statis tidak memiliki objek terkait, akankah kata kunci yang disinkronkan mengunci di kelas, bukan objek?
this
apakah kunci diperoleh pada metode instan-, mohon perbaiki Oscar.Hanya untuk menambahkan sedikit detail pada jawaban Oscar (menyenangkan ringkas!), Bagian yang relevan pada Spesifikasi Bahasa Jawa adalah 8.4.3.6, 'Metode yang disinkronkan' :
sumber
Satu hal yang Anda harus berhati-hati (beberapa programmer umumnya jatuh dalam perangkap itu) adalah bahwa tidak ada hubungan antara metode statis yang disinkronkan dan metode non-statis yang disinkronkan, yaitu:
Utama:
Utas 1:
Utas 2:
f () dan g () tidak disinkronkan satu sama lain dan dengan demikian dapat mengeksekusi secara bersamaan.
sumber
synchronized (MyClass.class) {...}
,.Kecuali Anda menerapkan g () sebagai berikut:
Saya menemukan pola ini berguna juga ketika saya ingin menerapkan saling pengecualian antara berbagai contoh objek (yang diperlukan ketika mengakses sumber daya eksternal, misalnya).
sumber
getClass()
mengembalikan tipe runtime ; jika Anda mensubclass kelas, maka kelas induk dan kelas anak akan disinkronkan pada kunci yang berbeda.synchronized(MyClass.class)
adalah cara untuk pergi jika Anda perlu memastikan semua contoh menggunakan kunci yang sama.Lihat halaman dokumentasi oracle tentang Kunci dan Sinkronisasi Intrinsik
sumber
Metode statis juga memiliki objek terkait. Itu milik file Class.class di JDK toolkit. Ketika file .class dimuat ke dalam ram, Class.class membuat sebuah instance yang disebut objek template.
Misalnya: - ketika Anda mencoba membuat objek dari kelas pelanggan yang sudah ada seperti
Kelas Pelanggan memuat ke dalam RAM. Pada saat itu, Class.class di JDK toolkit membuat Objek yang disebut objek Templat dan memuat yang Customer.class ke objek templat itu. Anggota statis dari Customer.class itu menjadi atribut dan metode dalam objek templat itu.
Jadi metode atau atribut statis juga memiliki objek
sumber
Contoh di bawah ini memberikan lebih banyak kejelasan antara kelas dan objek kunci, berharap contoh di bawah ini akan membantu orang lain juga :)
Sebagai contoh kita memiliki metode di bawah ini satu memperoleh kelas dan lainnya memperoleh kunci objek:
Jadi, sekarang kita dapat memiliki skenario berikut:
Ketika utas menggunakan Objek yang sama mencoba mengakses metode
objLock
ATAUstaticLock
waktu yang sama (yaitu kedua utas mencoba mengakses metode yang sama)Ketika utas menggunakan Objek yang sama mencoba mengakses
staticLock
danobjLock
metode waktu yang sama (mencoba mengakses metode yang berbeda)Ketika utas menggunakan Objek berbeda mencoba mengakses
staticLock
metodeKetika utas menggunakan Objek berbeda mencoba mengakses
objLock
metodesumber
Bagi mereka yang tidak terbiasa metode sinkronisasi statis terkunci pada objek kelas misalnya untuk kelas string-nya String.class sementara metode disinkronkan mengunci pada instance saat ini dari Obyek yang dilambangkan dengan kata kunci "this" di Jawa. Karena kedua objek ini berbeda, mereka memiliki kunci yang berbeda sehingga ketika satu utas menjalankan metode tersinkronisasi statis, utas lainnya di java tidak perlu menunggu utas itu kembali, melainkan akan memperoleh kunci terpisah yang ditandai byte .class literal dan masuk ke metode tersinkronisasi statis.
sumber