Java Multithreading - Blok Sinkron
Blok tersinkronisasi Java digunakan untuk menandai metode atau blok kode yang disinkronkan. Blok sinkronisasi Java digunakan untuk menghindari persaingan. Artikel ini memperkenalkan konten berikut:
Kata kunci yang disinkronkan Java (disinkronkan)
Blok yang disinkronkan di Java ditandai disinkronkan. Blok sinkronisasi disinkronkan pada objek di Java. Semua blok sinkronisasi yang disinkronkan pada suatu objek hanya dapat dimasukkan oleh satu utas dan melakukan operasi secara bersamaan. Semua utas lain yang menunggu untuk memasukkan blok sinkronisasi akan diblokir sampai utas di blok sinkronisasi dieksekusi keluar.
Ada empat blok sinkronisasi yang berbeda:
Blok sinkronisasi di atas semuanya disinkronkan pada objek yang berbeda. Blok sinkronisasi mana yang sebenarnya dibutuhkan tergantung pada situasi tertentu.
Sinkronisasi metode contoh
Berikut adalah metode contoh yang disinkronkan:
public disinkronkan void add (value int) {this.count += value; }
Sinkronisasi metode statis
Sinkronisasi metode statis sama dengan metode sinkronisasi metode instance, dan kata kunci yang disinkronkan juga digunakan. Sinkronisasi metode statis java adalah sebagai berikut:
public static static void add (value int) {count += value; }Demikian pula, kata kunci yang disinkronkan di sini memberi tahu Java bahwa metode ini disinkronkan.
Sinkronisasi metode statis mengacu pada sinkronisasi pada objek kelas di mana metode ini berada. Karena kelas hanya dapat sesuai dengan satu objek kelas dalam mesin virtual Java, hanya satu utas yang diizinkan untuk menjalankan metode sinkronisasi statis di kelas yang sama.
Untuk metode sinkronisasi statis di kelas yang berbeda, utas dapat menjalankan metode sinkronisasi statis di setiap kelas tanpa menunggu. Terlepas dari metode sinkronisasi statis di kelas yang dipanggil, kelas hanya dapat dieksekusi oleh satu utas pada saat yang sama.
Blok sinkron dalam metode contoh
Terkadang Anda tidak perlu menyinkronkan seluruh metode, tetapi sebaliknya menyinkronkan bagian dari metode ini. Java dapat menyinkronkan bagian dari suatu metode.
Contoh blok sinkronisasi dalam metode Java asinkron ditunjukkan di bawah ini:
public void add (value int) {disinkronkan (this) {this.count += value; }}Contoh Gunakan konstruktor blok sinkron java untuk menandai sepotong kode yang disinkronkan. Kode ini sama dengan metode sinkronisasi saat dieksekusi.
Perhatikan bahwa konstruktor blok sinkron java menutupi objek dalam tanda kurung. Dalam contoh di atas, "ini" digunakan, yaitu, instance itu sendiri yang memanggil metode add. Objek yang terlampir dalam kurung dalam konstruktor sinkronisasi disebut objek monitor. Kode di atas menggunakan sinkronisasi objek monitor, dan metode instance sinkron menggunakan contoh metode panggilan itu sendiri sebagai objek monitor.
Hanya satu utas yang dapat mengeksekusi dalam metode Java yang disinkronkan ke objek monitor yang sama sekaligus.
Dua contoh berikut ini menyinkronkan objek instan yang mereka sebut, sehingga mereka setara dalam efek eksekusi yang disinkronkan.
kelas publik myclass {public disinkronkan void log1 (string msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public void log2 (string msg1, string msg2) {disinkronkan (this) {log.writeln (msg1); log.writeln (msg2); }}}Dalam contoh di atas, hanya satu utas yang dapat dieksekusi di salah satu dari dua blok sinkronisasi sekaligus.
Jika blok sinkronisasi kedua tidak disinkronkan pada objek instance ini, kedua metode tersebut dapat dieksekusi secara bersamaan oleh utas.
Blok sinkron dalam metode statis
Mirip dengan hal -hal di atas, berikut ini adalah contoh dari dua metode statis sinkronisasi. Metode -metode ini disinkronkan pada objek kelas yang menjadi milik metode.
kelas publik myclass {public static static void log1 (string msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public static void log2 (string msg1, string msg2) {disinkronkan (myclass.class) {log.writeln (msg1); log.writeln (msg2); }}}Kedua metode ini tidak memungkinkan akses oleh utas secara bersamaan.
Jika blok sinkronisasi kedua tidak disinkronkan pada objek myClass.class. Kemudian kedua metode ini dapat diakses oleh utas secara bersamaan.
Contoh sinkronisasi Java
Dalam contoh berikut, dua utas dimulai, keduanya memanggil metode Tambah dari contoh yang sama dari kelas Counter. Karena sinkronisasi ada pada contoh yang dimiliki metode, hanya satu utas yang dapat mengakses metode pada saat yang sama.
penghitung kelas publik {jumlah panjang = 0; public disinkronkan void add (nilai panjang) {this.count += value; }} counterThread kelas publik memperluas thread {counter protected counter = null; CounterThread publik (penghitung penghitung) {this.count = counter; } public void run () {for (int i = 0; i <10; i ++) {counter.add (i); }}} Contoh kelas publik {public static void main (string [] args) {counter counter = new counter (); Thread threada = counterthread baru (counter); Thread threadB = counterthread baru (counter); threada.start (); threadb.start (); }}Dua utas dibuat. Konstruktor mereka mengacu pada contoh penghitung yang sama. Metode counter.add disinkronkan pada instance karena metode ADD adalah metode instan dan ditandai dengan kata kunci yang disinkronkan. Oleh karena itu, hanya satu utas yang diizinkan untuk memanggil metode ini pada satu waktu. Utas lain harus menunggu sampai utas pertama keluar dari metode add () sebelum terus menjalankan metode.
Jika dua utas mengacu pada dua contoh penghitung yang berbeda, mereka dapat memanggil metode add () secara bersamaan. Metode -metode ini menyebut objek yang berbeda, sehingga metode ini disinkronkan pada objek yang berbeda. Panggilan metode ini tidak akan diblokir. Seperti yang ditunjukkan dalam contoh berikut:
Contoh kelas publik {public static void main (string [] args) {counter countera = counter baru (); Counterb counterb = counter baru (); Thread threada = counterthread baru (countera); Thread threadB = new counterthread (counterb); threada.start (); threadb.start (); }}Perhatikan bahwa kedua utas ini, Threada dan ThreadB, tidak lagi merujuk ke instance counter yang sama. Metode tambah Countera dan CounterB disinkronkan pada objek tempat mereka berada. Memanggil metode Tambah Countera tidak akan memblokir panggilan ke Metode Tambah CounterB.
Di atas adalah penjelasan tentang pengetahuan tentang blok sinkronisasi multi-threaded Java. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs ini!