Thread merupakan konsep yang sangat penting dalam pemrograman Java. Artikel ini akan menjelaskannya secara detail dalam bentuk contoh. Analisis spesifiknya adalah sebagai berikut:
Pertama-tama, apa gunanya penguncian benang? Misalnya: Misalnya, jika Anda sekarang memiliki 30.000 yuan di bank, dan Anda pergi ke bank untuk menarik uang tersebut, setelah Anda memasukkan kata sandi, Anda sudah memasukkan jumlah penarikan Artinya bank akan mengambilkan uang untuk Anda. Saat itu, istri Anda juga pergi ke bank untuk menarik uang tersebut, dan Anda Istri saya juga menarik 20.000, karena rekening Anda saat ini masih 30.000, jadi bank melakukan operasi yang sama di pihak istri Anda. Dengan cara ini, setelah Anda berdua menyelesaikan operasi masing-masing, bank seharusnya masih memiliki 30.000 yang tercatat di rekening Anda .Setoran 10.000 yuan, bukankah ini bagus? Untuk mengatasi masalah ini digunakan ilmu penguncian benang. Mari kita pelajari bersama.
1. Contoh sinkronisasi thread yang tidak tertangani:
public class TextSync mengimplementasikan Runnable{ /**Sinkronisasi thread yang tidak tertangani* @param args */ Time time = new Time(); public static void main(String[] args) { TextSync text = new TextSync(); (teks); Utas t2 = Utas baru(teks); t1.setName("t1"); t2.setName("t2"); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); }}kelas Waktu { private static int num = 0; try { num++; //Saat thread pertama dijalankan hingga titik ini, num menjadi 1, dan thread pertama dijeda selama satu detik. //Saat thread kedua dijalankan hingga titik ini, num Menjadi 2, dan thread kedua berhenti selama satu detik. //Jumlah thread pertama juga menjadi 2 saat ini, jadi hasil akhirnya adalah 2; Thread.sleep(1000); catch (InterruptedException e) { e.printStackTrace(); " adalah "+angka+"thread eksekusi."); }}Hasil keluaran:
t2 adalah thread eksekusi kedua. t1 adalah thread eksekusi kedua.
2. Sinkronisasi utas
public class TextSynctwo mengimplementasikan Runnable{ /**Sinkronisasi thread* @param args */ Time1 time = new Time1(); public static void main(String[] args) { TextSynctwo text = new TextSynctwo(); teks); Utas t2 = Utas baru(teks); t1.setName("t1"); t1.start(); t2.start(); } @Override public void run() { waktu.tambahkan(Thread.currentThread().getName()); disinkronkan mengunci thread saat ini, yang dapat dideklarasikan ketika metode ditentukan, atau diatur dalam metode. public synced void add(String name){ //synchronized (this) {//Kunci thread saat ini untuk mencegahnya dieksekusi oleh thread lain coba { num++; Thread.sleep(1000); . printStackTrace(); } System.out.println(nama+"adalah "+angka+"thread eksekusi."); //} }}Hasil keluaran:
t1 adalah thread eksekusi pertama. t2 adalah thread eksekusi kedua.
3. Kebuntuan
kelas publik TestDeadLock mengimplementasikan Runnable{ /**Deadlock* @param args */ private int flag = 0; Objek statis o1 = Objek baru statis o2 = Objek baru(); { TestDeadLock td1 = TestDeadLock baru(); TestDeadLock td2 = TestDeadLock baru(); = 1; td2.flag = 2; Benang t1 = Benang baru(td1); Benang t2 = Benang baru(t1.setName("t1"); ; t2.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()); if(flag == 1){ disinkronkan(o1){ coba { Thread.sleep(5000); ); } tersinkronisasi(o2){ Sistem.keluar.println("1"); disinkronkan(o2){ coba { Thread.sleep(5000); catch (InterruptedException e) { e.printStackTrace(); } disinkronkan(o1){ System.out.println("2");4. Kunci
implementasi TT kelas publik Runnable{ /**Lock* @param args */ int b = 100; public static void main(String[] args) { TT tt = new TT(); .mulai(); coba { tt.m2(); } tangkap (Pengecualian e) { e.printStackTrace(); System.out.println(tt.b); } @Override public void run() { coba { m1(); } catch (Pengecualian e) { e.printStackTrace(); b = 1000; Thread.sleep(5000); System.out.println("b="+b); lemparan void m2() yang disinkronkan secara pribadi Pengecualian{ Thread.sleep(2500); b = 2500;Outputnya sekarang adalah:
1000b=1000
Terlihat m2 dieksekusi terlebih dahulu, dan m1 tidak dapat dieksekusi sampai m2 selesai.
Saya harap artikel ini bermanfaat untuk desain pemrograman Java semua orang.