Sinkronisasi utas java pada dasarnya sejalan dengan logika: Tambahkan kunci -------> Modifikasi --------> Kunci Rilis
1. Sinkronisasi blok kode
Contohnya adalah sebagai berikut:
SyncBlock kelas publik {static class dataWrap {int i; } kelas statis syncblockthread memperluas thread {private DataWrap Date; public syncblockthread (dataWrap dataWrap) {this.date = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {disinkronkan (date) {date.i ++; coba {sleep (1); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// variabel implementasi multi-thread saya menambahkan satu output dalam urutan dataWrap dataWrap = datawrap baru (); SyncBlockThread baru (DataWrap) .start (); SyncBlockThread baru (DataWrap) .start (); SyncBlockThread baru (DataWrap) .start (); }}Dalam contohnya, Anda ingin mengeluarkan bilangan bulat secara berurutan.
Biasanya, blok kode sinkron adalah objek yang perlu dikunci, dan umumnya merupakan sumber daya bersama yang membutuhkan akses bersamaan. Setiap utas pertama mengunci sumber daya sebelum memodifikasi sumber daya yang ditentukan. Selama periode penguncian, utas lain tidak dapat memodifikasi sumber daya. Ini memastikan keamanan utas. Selain itu, utas tidak akan melepaskan kunci sumber daya saat memanggil tidur atau hasil.
2. Metode sinkronisasi
SyncMethod kelas publik {kelas statis dataWrap {int i; public disinkronkan void valueGrow () {i ++; coba {thread.sleep (1); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); }} class static SyncMethodThread Extends Thread {DataWrap DataWrap; public syncmethodthread (dataWrap dataWrap) {this.datawrap = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {DataWrap.ValueGrow (); }}} public static void main (string [] args) {// mengimplementasikan pertumbuhan sekuensial dan output i dataWrap dataWrap = new DataWrap (); SYNCMETHODTHREAD baru (DataWrap) .start (); SYNCMETHODTHREAD baru (DataWrap) .start (); SYNCMETHODTHREAD baru (DataWrap) .start (); }}Metode sinkronisasi adalah metode yang dimodifikasi oleh kata kunci yang disinkronkan. Metode sinkronisasi mengunci objek itu sendiri. Oleh karena itu, ketika utas memanggil metode sinkronisasi dari objek tertentu, jika utas lain memanggil metode sinkronisasi lain dari objek, mereka masih harus menunggu untuk melepaskan kunci objek karena objek telah dikunci.
3. Kunci sinkron
Sinkronisasi dicapai dengan mendefinisikan objek kunci sinkronisasi, dalam hal ini kunci sinkronisasi menggunakan objek kunci untuk bertindak sebagai.
impor java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; Synclock kelas publik {static class dataWrap {lock lock = baru reentrantlock (); int i; public void valueGrow () {lock.lock (); coba {i ++; coba {thread.sleep (1); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); } System.out.println (thread.currentThread (). GetName () + "" + i); } akhirnya {lock.unlock (); }}} kelas statis synclockthread memperluas utas {dataWrap dataWrap; SynclockThread publik (dataWrap dataWrap) {this.datawrap = dataWrap; } @Override public void run () {for (int i = 0; i <10; i ++) {DataWrap.ValueGrow (); }}} public static void main (string [] args) {// mengimplementasikan pertumbuhan sekuensial dan output i dataWrap dataWrap = new DataWrap (); SynclockThread baru (DataWrap) .start (); SynclockThread baru (DataWrap) .start (); SynclockThread baru (DataWrap) .start (); }}Menggunakan objek kunci untuk mengimplementasikan sinkronisasi utas akan lebih fleksibel. Beberapa kunci juga memiliki beberapa fungsi spesifik, di antaranya readwritelock membaca dan menulis kunci yang lebih umum digunakan, dan reentrantlock dapat masuk kembali ke kunci.