Rumah  >  Artikel  >  Java  >  Analisis contoh keselamatan dan penyegerakan benang Java

Analisis contoh keselamatan dan penyegerakan benang Java

WBOY
WBOYke hadapan
2023-04-29 20:58:05838semak imbas

Isu keselamatan benang

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

Contoh:

Masalah deposit dan pengeluaran

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-1

Betul: baki selepas tamat hendaklah 998, bukan 999

Contoh ralat pembelian tiket (bukan benang disegerakkan):

public 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:


Isu keselamatan benang

Isu analisis

Benang A dan B melakukan operasi +1 pada 1 pembolehubah dalam kelas dengan nilai 17

Keputusan akhir ialah 2 18

PenyelesaianAnalisis contoh keselamatan dan penyegerakan benang Java

Kunci:

Proses: Mula-mula, utas A mengakses 17 ini dahulu selepas membacanya, ia dikunci dan memasuki +1 operasi dan menukarnya kepada 18
Dan 17 tidak boleh diakses oleh benang lain semasa tempoh penguncian
Selepas perubahan selesai Kemudian tulis, kemudian buka kunci 17

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

Benang penyegerakan

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

2. Kaedah 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 Analisis contoh keselamatan dan penyegerakan benang Java

4 Apabila berbilang urutan mengakses pernyataan (obj) yang disegerakkan

obj mestilah objek yang sama untuk dicapai. penyegerakan

Kaedah disegerakkan

public 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 penyegerakan

Pernyataan penyegerakan boleh mengawal dengan tepat skop kod yang perlu dikunci, mengurangkan benang dalam keadaan DISEKAT , dan gunakan sepenuhnya tenaga kerja

Gunakan Selepas menambah teknologi penyegerakan benang
Walaupun masalah keselamatan benang diselesaikan, ia mengurangkan kecekapan pelaksanaan program

Kerana 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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam