1. 程式人生 > 實用技巧 >Java中多執行緒的使用(超級超級詳細)執行緒安全原理解析 4

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

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