Ketika kata kunci bahasa Java digunakan untuk memodifikasi metode atau blok kode, itu dapat memastikan bahwa paling banyak satu utas menjalankan kode secara bersamaan.
1. Gunakan saat mendeklarasikan metode ini, setelah operator ruang lingkup (publik, dll.), Sebelum deklarasi tipe pengembalian (batal, dll.). Masukkan metode pada satu waktu, dan utas lainnya jika Anda ingin memanggil metode ini saat ini, Anda hanya dapat menunggu dalam antrean. bisa masuk.
Misalnya:
public disinkronkan void synmethod () {// Method Body}2. Gunakan sinkronisasi diikuti oleh tanda kurung, dan variabel termasuk dalam kurung.
Public int synmethod (int a1) {disinkronkan (a1) {// Hanya satu utas yang dapat masuk pada satu waktu}} 3. Ada objek dalam tanda kurung setelah disinkronkan.
Kelas Publik MyThread Runnable {public static void main (string args []) {mythread mt = myThread baru (); ); t6 "); t1.start (); t2.start (); t3.start (); t4.start (); t5.start (); t6.start ();} public void run () {disinkronkan (ini ) {System.out.println (thread.currentThread (). GetName ());Untuk 3, jika utas masuk, ia mendapatkan kunci objek saat ini, dan kemudian operasi apa pun dari utas lain pada semua objek di kelas tidak dapat dilakukan. Mengapa mengunci seluruh objek tanpa membiarkan utas lain untuk secara singkat menggunakan metode sinkronisasi lain di objek untuk mengakses sumber daya bersama? Jika suatu objek memiliki banyak sumber daya, ia tidak perlu mengunci semua utas di luar hanya untuk memiliki utas menggunakan beberapa sumber daya. Karena setiap objek memiliki kunci, Anda dapat menggunakan objek virtual untuk menguncinya sebagai berikut:
kelas fineGrainLock {mymemberclass x, y; Gunakan sumber daya bersama disinkronkan (ylock) {// akses y di sini}} public void bar () {disinkronkan (ini) {// akses baik x dan y di sini} // lakukan sesuatu di sini - tetapi jangan gunakan sumber daya bersama} }4. Kelasnya ada di dalam tanda kurung setelah disinkronkan.
class arraylockorder {private static long num_locks = 0; / Tambahkan 1 ke nomor kunci. lock_order = num_locks; // atur lock_order unik untuk instance objek ini. }} public lockorder () {return lock_order; ; int size = a1.array (). panjang; if (size == a2.Array (). length) {if (a1.lockorder ()> a2.lockorder ()) // Tentukan dan atur kunci objek { // memesan. pertama = a2; disinkronkan (terakhir) {int [] arr1 = a1.array (); i];}}} nilai kembali;Untuk 4, jika utas masuk, semua operasi di utas tidak dapat dilakukan di kelas, termasuk variabel statis dan metode statis.
PS: Ringkasan penggunaan yang disinkronkan
Sinkronisasi menggunakan berbagai tempat untuk mempengaruhi kode:
1. Metode modifikasi kata kunci yang disinkronkan
Dengan asumsi bahwa P1 dan P2 adalah objek yang berbeda dari kelas yang sama, kelas ini mendefinisikan blok sinkronisasi atau metode sinkronisasi dalam situasi berikut, dan P1 dan P2 dapat memanggilnya.
Metode void yang disinkronkan publik () {//}Ini adalah metode sinkronisasi. Dengan kata lain, ketika suatu objek P1 menjalankan metode sinkronisasi ini di utas yang berbeda, mereka akan membentuk pengecualian timbal balik untuk mencapai efek sinkronisasi. Pada saat yang sama, jika ada beberapa metode sinkronisasi dalam objek, ketika utas menjalankan metode yang disinkronkan dalam objek, metode sinkronisasi lain dalam objek tidak diizinkan untuk dieksekusi oleh utas lain. Namun, objek lain P2 yang dihasilkan oleh kelas yang dimiliki oleh objek ini dapat secara sewenang -wenang menyebut metode ini dengan kata kunci yang disinkronkan ditambahkan.
Kode contoh di atas setara dengan kode berikut:
Metode public void () {disinkronkan (this) {// ..}}Kali ini adalah kunci objek P1. Singkirkan kendali mekanisme sinkronisasi dan menyebabkan kebingungan data.
2. Sinkronisasi blok, kode sampel adalah sebagai berikut:
Metode public void () {disinkronkan (this) {// ..}}Pada saat ini, kunci adalah objek SO, dan masing -masing objek sesuai dengan kunci yang unik, jadi siapa pun utas yang mendapatkan kunci objek ini akan dapat menjalankan kode yang dikendalikannya. Ketika ada objek yang jelas sebagai kunci, Anda dapat menulis program seperti ini, tetapi ketika tidak ada objek yang jelas sebagai kunci, Anda hanya ingin sepotong kode untuk disinkronkan, Anda dapat membuat variabel instance khusus (harus jadi sebuah objek) untuk bertindak sebagai kunci:
byte pribadi [] lock = byte baru [0];
Catatan: Objek array byte nol-panjang lebih ekonomis daripada objek apa pun untuk dibuat.
3. Gunakan disinkronkan ke fungsi statis, kode contoh adalah sebagai berikut:
Class foo {public static void method1 () {//. Kedua metode sinkron memanggil kunci kelas kelas yang dimiliki oleh objek metode ini (kelas, tidak lagi objek spesifik yang dihasilkan oleh kelas ini).
Dapat disimpulkan bahwa jika suatu kelas mendefinisikan fungsi statis yang disinkronkan A dan juga mendefinisikan fungsi instance yang disinkronkan B, maka objek yang sama OBJ dari kelas ini tidak akan membentuk metode A dan B masing -masing saat mengakses dua metode A dan B di beberapa utas Sinkronisasi karena kuncinya berbeda. Kunci metode A adalah kelas yang menjadi milik OBJ, dan kunci B adalah objek yang menjadi milik OBJ.