Spring系列(八)
阿新 • • 發佈:2020-07-15
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,就導致了問題的發生
以上就是我對執行緒安全的一些理解,如果有錯誤還請各位批評指正,喜歡我的可以點贊收藏一波,我基本每天都會跟新文章,可以關注我互相交流