#### 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)。\****
問:爲何使用線程同步或使用鎖能解決線程安全問題呢?
***\*答:將可能會發生數據衝突問題(線程不安全問題),只能讓當前一個線程進行執行。代碼執行完成後釋放鎖,讓後才能讓其餘線程進行執行。這樣的話就能夠解決線程不安全問題。\****
問:什麼是多線程之間同步
***\*答:當多個線程共享同一個資源,不會受到其餘線程的干擾。\****