Kata kunci tersinkronisasi memiliki dua kegunaan. Yang pertama adalah menggunakannya secara langsung dalam definisi metode seperti yang diperkenalkan dalam artikel "Menggunakan kata kunci Tersinkronisasi untuk menyinkronkan metode kelas". Tipe lainnya adalah blok tersinkronisasi. Kita tidak hanya dapat menyinkronkan variabel objek melalui blok yang disinkronkan. Anda juga dapat menggunakan blok tersinkronisasi untuk menyinkronkan metode statis dan non-statis di kelas.
Sintaks blok tersinkronisasi adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
metode kekosongan publik()
{
… …
disinkronkan (ekspresi)
{
… …
}
}
1. Sinkronisasi metode kelas non-statis
Dari artikel "Menggunakan kata kunci Tersinkronisasi untuk menyinkronkan metode kelas" kita mengetahui bahwa menggunakan kata kunci tersinkronisasi untuk mendefinisikan metode akan mengunci semua metode statis atau non-statis yang ditentukan menggunakan kata kunci tersinkronisasi di kelas, tetapi ini tidak mudah untuk dipahami. Jika Anda menggunakan blok tersinkronisasi untuk mencapai efek yang sama, tidak sulit untuk memahami mengapa efek ini terjadi. Jika Anda ingin menggunakan blok tersinkronisasi untuk mengunci semua metode non-statis tersinkronisasi dalam suatu kelas, Anda perlu menggunakan ini sebagai parameter blok tersinkronisasi dan meneruskannya ke negara blok tersinkronisasi. Kodenya adalah sebagai berikut:
Sinkronisasi metode non-statis melalui blok yang disinkronkan
Copy kode kodenya sebagai berikut:
SyncBlock kelas publik
{
metode kekosongan publik1()
{
tersinkronisasi(ini) // Setara dengan menggunakan kata kunci tersinkronisasi pada metode metode1
{
… …
}
}
metode kekosongan publik2()
{
disinkronkan(ini) // Setara dengan menggunakan kata kunci tersinkronisasi untuk metode metode2
{
… …
}
}
metode kekosongan tersinkronisasi publik3()
{
… …
}
}
Dalam kode di atas, blok tersinkronisasi digunakan dalam metode metode1 dan metode2. Metode method3 pada baris 017 masih menggunakan kata kunci tersinkronisasi untuk mendefinisikan metodenya. Saat menggunakan instance kelas SyncBlock yang sama, selama salah satu dari tiga metode dijalankan, dua metode lainnya akan diblokir karena kunci sinkronisasi tidak diperoleh. Untuk mencapai efek yang sama seperti kata kunci tersinkronisasi saat menggunakan blok tersinkronisasi, semua kode harus ditulis dalam blok tersinkronisasi, jika tidak, semua kode dalam metode saat ini tidak akan disinkronkan dengan metode lain.
Selain menggunakan ini sebagai parameter blok yang disinkronkan, Anda juga dapat menggunakan SyncBlock.this sebagai parameter blok yang disinkronkan untuk mencapai efek yang sama.
Saat menggunakan blok tersinkronisasi dalam metode kelas dalam (InnerClass), ini hanya mewakili kelas dalam dan tidak ada hubungannya dengan kelas luar (OuterClass). Tetapi metode non-statis dari kelas dalam dapat disinkronkan dengan metode non-statis dari kelas luar. Misalnya, tambahkan metode method4 ke kelas dalam InnerClass dan sinkronkan metode method4 dengan tiga metode SyncBlock. Kodenya adalah sebagai berikut:
Sinkronkan metode non-statis kelas dalam dengan metode non-statis kelas luar
Copy kode kodenya sebagai berikut:
SyncBlock kelas publik
{
… …
kelasInnerClass
{
metode kekosongan publik4()
{
disinkronkan (SyncBlock.ini)
{
… …
}
}
}
… …
}
Dalam versi baru kelas SyncBlock di atas, metode 4 dari kelas InnerClass disinkronkan dengan tiga metode lainnya dari kelas SyncBlock. Oleh karena itu, hanya satu metode dari empat metode metode1, metode2, metode3, dan metode4 yang dapat dieksekusi waktu yang sama.
Apakah blok yang disinkronkan dijalankan secara normal atau keluar dari blok yang disinkronkan secara tidak normal karena kesalahan program, kunci sinkronisasi yang ditahan oleh blok yang disinkronkan saat ini akan dilepaskan secara otomatis. Oleh karena itu, Anda tidak perlu khawatir tentang pelepasan kunci sinkronisasi saat menggunakan blok yang disinkronkan.
2. Sinkronisasi metode kelas statis
Karena saat memanggil metode statis, instance objek belum tentu dibuat. Oleh karena itu, Anda tidak dapat menggunakan ini untuk menyinkronkan metode statis, tetapi Anda harus menggunakan objek Kelas untuk menyinkronkan metode statis. Kodenya adalah sebagai berikut:
Sinkronkan metode statis melalui blok yang disinkronkan
Copy kode kodenya sebagai berikut:
StaticSyncBlock kelas publik
{
metode kekosongan statis publik1()
{
disinkronkan (StaticSyncBlock.class)
{
… …
}
}
metode kekosongan tersinkronisasi statis publik2()
{
… …
}
}
Saat menyinkronkan metode statis, Anda dapat menggunakan kelas bidang statis dari kelas tersebut untuk mendapatkan objek Kelas. Dalam contoh di atas, hanya satu metode metode1 dan metode2 yang dapat dijalankan secara bersamaan. Selain menggunakan bidang kelas untuk mendapatkan objek Kelas, Anda juga dapat menggunakan metode getClass dari instance tersebut untuk mendapatkan objek Kelas. Kode pada contoh di atas dapat dimodifikasi sebagai berikut:
Gunakan metode getClass untuk mendapatkan objek Kelas
Copy kode kodenya sebagai berikut:
StaticSyncBlock kelas publik
{
contoh StaticSyncBlock statis publik;
StaticSyncBlock publik()
{
contoh = ini;
}
metode kekosongan statis publik1()
{
disinkronkan(instance.getClass())
{
}
}
}
Dalam kode di atas, sebuah instance dari kelas StaticSyncBlock diperoleh melalui instance statis publik, dan objek Kelas diperoleh melalui metode getClass dari instance ini (semua instance dari suatu kelas memperoleh objek Kelas yang sama melalui metode getClass, oleh karena itu, memanggil metode getClass apa pun dari sebuah instance dapat digunakan). Kita juga dapat menyinkronkan metode statis dari kelas yang berbeda melalui objek Kelas, seperti metode metode statis dari kelas Test dan dua metode statis dari kelas StaticSyncBlock. Kodenya adalah sebagai berikut:
Metode metode kelas Test disinkronkan dengan metode metode1 dan metode2 kelas StaticSyncBlock.
Copy kode kodenya sebagai berikut:
Tes kelas publik
{
metode kekosongan statis publik()
{
disinkronkan (StaticSyncBlock.class)
{
}
}
}
Catatan: Saat menggunakan metode kelas sinkronisasi blok tersinkronisasi, metode non-statis dapat menggunakan ini untuk melakukan sinkronisasi, sedangkan metode statis harus menggunakan objek Kelas untuk melakukan sinkronisasi. Mereka tidak saling mempengaruhi. Tentu saja, Anda juga dapat menggunakan objek Kelas dalam metode non-statis untuk menyinkronkan metode statis. Tapi ini tidak bisa digunakan dalam metode statis untuk menyinkronkan metode non-statis. Ini harus diperhatikan ketika menggunakan metode kelas sinkronisasi blok tersinkronisasi.