1. 程式人生 > 實用技巧 >Spring系列(八)

Spring系列(八)

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,就導致了問題的發生

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