多執行緒的安全問題

2021-08-16 03:47:38 字數 2035 閱讀 8984

舉個例子說一下多執行緒的安全問題

public class threaddemo implements runnable 

}

public class threadtest 

}

兩個執行緒一起啟動,我們想要的結果是thread-0進入run方法,列印輸出1,緊接著thread-1進入run方法,列印輸出2,但是可能發生的情況是:thread-0進入run方法,對num加1後,num變成1,此時執行緒thread-0停在此處,執行權讓給thread-1,再對num運算,變成2,然後兩個執行緒列印出來的都是2了。

解決方法:採用同步(synchronized)

格式為

synchronized (物件)
public class threaddemo implements runnable 		}

}

引數裡面的物件可以是任意乙個物件,隨便什麼物件都行,但是如果要實現同步,這個物件必須是唯一的,這裡的物件我們稱為鎖,當thread-0進入run方法後,會持有鎖o,此時如果thread-1進來run方法,會被擋在被synchronized包裹的**塊外,不允許進入,當thread-0執行完**塊裡的**後,會釋放鎖,此時thread-1就可以拿到鎖,執行**塊,兩個執行緒相敬如賓,恩恩**,和睦相處,生活中的例子就是「火車上的廁所」,火車上有乙個廁所,小明先進去,把門鎖上,在裡面邊玩手機邊蹲坑,小剛捂著肚子過來了,發現裡面有人,只好在外面等著,等小明弄完,把門開啟,小剛就可以進去了。

這時我們把上面的**改一下

public class threaddemo implements runnable 		}

}

object挪到了run方法裡面,由成員變數變成了區域性變數,那麼兩個執行緒執行run方法的時候,就會new兩次物件,相當於兩把鎖,此時就不能解決安全問題了,我拿著我的鎖進**塊,你拿著你的鎖進**塊,我們互不限制,就好像火車上有兩個廁所,小明上了乙個,小剛跑去上另外乙個。所以實現同步安全的條件是:多個執行緒,一把鎖。

同步**塊還有一種寫法是

public class threaddemo implements runnable 

}}

就是在synchronized的引數裡面加this,那麼哪個threaddemo物件呼叫了這個方法,這個this就是指哪個物件,只要保證這個物件是唯一的,就可以實現同步安全。

上面講的是同步**塊,接下來是同步方法,同步方法其實就是在方法修飾符裡加乙個synchronized關鍵字,這裡說一下靜態同步方法

public class threaddemo implements runnable 

public static synchronized void add()

}}

如果這個方法是靜態方法,那就不能用synchronize(this)了,因為靜態方法在類初始化的時候就會載入,但是synchronize(this)在物件呼叫的時候才載入,所以引數不能用this,我們一般用當前類的位元組碼檔案物件:***.class,每乙個類的位元組碼檔案物件都是唯一的,所以用它當鎖是可以實現同步的。

接下來說說死鎖

首先建立兩個物件,也就是兩把鎖

class mylock

然後進行同步的巢狀

class threaddemo implements runnable

public void run() } } else } } } }

接下來是測試類

public class deadlocktest

}

thread-0拿到a鎖,進入**塊,thread-1拿到b鎖,進入**塊,此時thread-0不釋放a鎖,等著對方釋放b鎖,對方不釋放b鎖,等著thread-0釋放a鎖,相持不下,形成死鎖。

多執行緒安全問題

這裡的安全問題可以理解為 實現在邏輯上的問題,比如 火車站賣票 100張票讓4個人去賣,一定不能出現賣的票是負數問題,那麼開啟多執行緒後,如何才能保證賣的票不可能存在負數呢?常用的解決方法有兩種 1,使用同步 塊,把需要同步的 再放同步 塊中 2,使用同步函式 同步的鎖,可以理解為就是那個物件!同步...

多執行緒(多執行緒的安全問題)

多執行緒的執行出現安全問題。非常可怕的問題,一出問題比較惱火 問題原因 重點 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒執行完,另乙個執行緒參與進來執行。導致共享資料的錯誤。解決方法 對多條操作共享資料的語句,只能讓乙個執行緒都執行完,在執行過程中,其他執行緒不...

多執行緒的安全問題

首先先提出幾個問題 1.多執行緒程式設計何時會出現執行緒不安全的問題?2.如何解決執行緒不安全的問題?執行緒不安全的本質是多執行緒共享資料,那麼什麼情況下多執行緒會共享資料?無外乎這麼幾種情況 1 多執行緒訪問單例項中的例項變數 2 多執行緒訪問靜態變數 下面將舉例說明,這個例子模擬鐵路售票系統,實...