Java中多線程的使用(超級超級詳細)線程安全原理解析 4

Java中多線程的使用(超級超級詳細)線程安全 4

什麼是線程安全?

在這裡插入圖片描述

有多個線程在同時運行,這些線程可能會運行相同的代碼,程序運行的每次結果和單線程運行的結果是一樣的,而且其他變量的值也和預期的值一樣,這就是線程安全
我們下面來用一段代碼來演示線程不安全的情況,下面用車站賣票來舉例

package ThreadSafe;

public class Main {
    public static void main(String[] args) {
    //使用同一個對象
        ThreadSafe threadSafe = new ThreadSafe();
        Thread  one = new Thread(threadSafe, "一號");
        Thread two = new Thread(threadSafe, "二號");
        Thread three = new Thread(threadSafe, "三號");
        one.start();
        two.start();
        three.start();
    }
}
package ThreadSafe;

public class ThreadSafe implements Runnable {
    private  int ticketsum=100;
    public  void  run(){
      while(true){
          if (ticketsum>0){
              try {
                  Thread.sleep(10);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              String name = Thread.currentThread().getName();
              System.out.println(name+"正在賣:"+ticketsum--);
          }
      }

    }
}

結果
在這裡插入圖片描述

我們發現一號二號三號都在重複賣同一張票,這種問題在現實生活中是不被允許出現的,是會出現事故的,這就是線程不安全導致的問題

下面我們來講解為什麼會出現線程安全問題

線程安全原理解析

在這裡插入圖片描述

賣票出現了負數的票

在這裡插入圖片描述

賣票出現了重複的票

在這裡插入圖片描述這樣理解起來我當初還思考了好久,不過體驗一下下面這段話後我就有點領悟了:
多線程並不是線程並行(真正的線程並行需要多個cpu),而是通過cpu時間片輪換來完成的,所以就存在一個問題,當a線程進入線程體的時候,執行了System.out語句,這是他的時間片到期了,b線程進入,b線程在他的時間片內執行完了之後,a線程接着往下運行,他用的不是b執行過的ticket–,而是原來的ticket,就導致了問題的發生

以上就是我對線程安全的一些理解,如果有錯誤還請各位批評指正,喜歡我的可以點贊收藏一波,我基本每天都會跟新文章,可以關注我互相交流

在這裡插入圖片描述