Rumah >Java >javaTutorial >Analisis contoh keselamatan dan penyegerakan benang Java
Berbilang rangkaian mungkin berkongsi (mengakses) sumber yang sama
Sebagai contoh, akses objek yang sama, pembolehubah yang sama, fail yang sama
Apabila Apabila berbilang rangkaian mengakses sumber yang sama, adalah mudah untuk menyebabkan kekeliruan data dan isu keselamatan data, yang dipanggil isu keselamatan rangkaian
Dalam keadaan apakah isu keselamatan rangkaian akan berlaku?
Perkongsian berbilang rangkaian Sumber yang sama
dan sekurang-kurangnya satu utas sedang menjalankan operasi tulis
Terdapat 2 deposit dan pengeluaran masing-masing . -》2000
500 "-----1000-500
Betul: baki sepatutnya 1500 selepas tamat, bukan 500
Masalah pembelian tiket
Terdapat 2 rangkaian menjual tiket
Menjual tiket 999
999《-----1000-1Betul: baki selepas tamat hendaklah 998, bukan 999
Contoh ralat pembelian tiket (bukan benang disegerakkan):Isu keselamatan benangIsu analisisBenang A dan B melakukan operasi +1 pada 1 pembolehubah dalam kelas dengan nilai 17public class love implements Runnable{ private int piao=3000;//有3000张票 public boolean sale() {//ture代表还有票;false代表没有票了 if(piao<1) return false; piao--;//卖1张票 //细化piao--; //寄存器=piao; //寄存器=寄存器-1; //piao=寄存器; String sk =Thread.currentThread().getName();//获取当前线程(买票窗口)的名字 System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>1; } public void run() { while(sale());//循环执行;直至卖完票返回false } } public class Main { public static void main(String[] a) { love tjlove =new love(); for(int i=1;i<=4;i++) {//循环4次;产生4个线程(窗口)卖票 Thread tj = new Thread(tjlove()); tj.setName(""+i); tj.start(); } } }
Hasil keluaran separa:
Keputusan akhir ialah 2 18
Penyelesaian
Kunci: Proses: Mula-mula, utas A mengakses 17 ini dahulu selepas membacanya, ia dikunci dan memasuki +1 operasi dan menukarnya kepada 18 Kemudian benang B mengaksesnya, kemudian menguncinya, ulangi operasi di atas menjadi 19 dan kemudian membuka kuncinya
Ini boleh memastikan bahawa hanya satu utas boleh mengaksesnya pada masa yang sama Ia, sekali gus memastikan keselamatan sebelumnya disebabkan oleh utas ini mengaksesnya bersama
Operasi penguncian yang baru disebut ialah teknologi penyegerakan benang
Teknologi penyegerakan benang boleh digunakan untuk menyelesaikan isu keselamatan benang
Penyegerakan benang mempunyai dua kaedah dalam Java:
1. Pernyataan penyegerakan
Pernyataan penyegerakan
public class love implements Runnable{ private int piao=3000;//本人cpu单核性能过强,数据量大些才能看到是4个线程在卖票 public boolean sale() { synchronized(this) {//1个线程获取这个对象的锁,并加锁; synchronized作用于整个语句 //this指向当前对象 //不能用new Object();这样会产生新的对象,产生新的锁 //把this换成"123",效果基本一样;因为其存在常量值里,每次访问的对象一样 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } } public void run() { while(sale()); } }
Hasil keluaran separa:
Prinsip synchronize(obj)1 Setiap objek mempunyai kunci intrinsik yang berkaitan dengannya atau kunci monitor 2. Urutan pertama yang melaksanakan pernyataan penyegerakan boleh mendapatkan kunci dalaman obj. Selepas melaksanakan pernyataan penyegerakan Lepaskan kunci ini selepas kod 3 Selagi satu utas memegang kunci dalaman, utas lain tidak lagi akan dapat memperoleh kunci ini pada masa yang sama<.>✓ Apabila mereka cuba memperoleh kunci ini, Ia akan memasuki keadaan TERSEKAT
4 Apabila berbilang urutan mengakses pernyataan (obj) yang disegerakkan obj mestilah objek yang sama untuk dicapai. penyegerakan Kaedah disegerakkanpublic class love implements Runnable{ private int piao=3000; public synchronized boolean sale() { //synchronized作用于整个方法 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } public void run() { while(sale()); } }disegerakkan tidak boleh mengubah suai pembina Intipati kaedah disegerakkan Kaedah contoh: disegerakkan (ini)Kaedah statik: disegerakkan (Objek Kelas )Pernyataan penyegerakan lebih fleksibel daripada kaedah penyegerakanPernyataan penyegerakan boleh mengawal dengan tepat skop kod yang perlu dikunci, mengurangkan benang dalam keadaan DISEKAT , dan gunakan sepenuhnya tenaga kerjaGunakan Selepas menambah teknologi penyegerakan benangWalaupun masalah keselamatan benang diselesaikan, ia mengurangkan kecekapan pelaksanaan programKerana selepas menambah kunci, akan ada benang menunggu, dan terdapat lebih banyak operasi kunci dan buka kunci Jadi hanya gunakan teknologi penyegerakan benang apabila ia benar-benar perlu
Atas ialah kandungan terperinci Analisis contoh keselamatan dan penyegerakan benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!