多線程--安全

#### 1.線程安全問題安全


什麼是線程安全問題:當多個線程同時訪問一個全局變量,注意(作寫的操做的時候可能會受到別的線程的干擾),作讀的操做的時候不會發生線程安全問題多線程


如  ++  ,  --  修改等操做  搶火車票的操做,就會引起線程安全問題併發

圖片




模擬場景:ide


```this

package com.yxl.demo.ThreadTest;spa


public class test5 {線程


   public static void main(String[] args) {3d


       TestDemo thread = new TestDemo();blog

       Thread t1 = new Thread(thread,"窗口一");圖片

       Thread t2 = new Thread(thread,"窗口二");

       t1.start();

       t2.start();

   }

}


class TestDemo implements Runnable{

   //共享的火車票變量

   private  int count = 100;


   //重寫run方法

   @Override

   public void run() {

       while (count > 0){

           try {

            //休眠一下 方便出現併發問題

               Thread.sleep(50);

           }catch (Exception e){

               e.getMessage();

           }

           sale();

       }

   }

   //賣票

   public void sale(){

       if(count > 0){

           System.out.println(Thread.currentThread().getName() +"出售 :" +(100 -  count + 1));

           count--;

       }

   }

}


```


運行結果以下:會發現出現賣重複票的問題



圖片



##### 解決這個線程安全問題


##### 內置鎖(Synchronized)保證線程原子性,當先車管進入方法自動的獲取鎖,當某一個線程獲取到鎖後,其餘線程就會等待,


鎖的特性:只有一個線程進行使用。


放程序執行完畢之久,就會把鎖釋放,可是鎖會下降程序的運行效率,


##### Synchronized 也是 重入鎖,內置鎖也是互斥鎖


使用 Synchronized 有兩種方式,  同步方法(使用的是this鎖),同步代碼塊


synchronized 修飾方法使用鎖是當前this鎖。


synchronized 修飾靜態方法使用鎖是當前類的字節碼文件


##### 顯示鎖 (lock鎖)



解決方案 :


##### 1.同步方法



圖片



2. ##### 同步代碼塊



圖片



使用同步代碼塊的時候 注意(鎖必定要使用同一個鎖 )




問:如何解決多線程之間線程安全問題


***\*答:使用多線程之間同步synchronized或使用鎖(lock)。\****


問:爲何使用線程同步或使用鎖能解決線程安全問題呢?


***\*答:將可能會發生數據衝突問題(線程不安全問題),只能讓當前一個線程進行執行。代碼執行完成後釋放鎖,讓後才能讓其餘線程進行執行。這樣的話就能夠解決線程不安全問題。\****


問:什麼是多線程之間同步


***\*答:當多個線程共享同一個資源,不會受到其餘線程的干擾。\****

相關文章
相關標籤/搜索