1.什么是線程安全?
線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的數(shù)據時,進行保護,其它線程不能進行訪問直到該線程讀取完,其它線程才可以使用.(類似于上廁所關門,其他人不能進去)
2.什么是線程不安全?
線程不安全就是不提供數(shù)據訪問保護,有可能會出現(xiàn)多個線程先后更改數(shù)據,或者沒有數(shù)據等
例子:
火車站買票,總共有1000張票,有四個窗口在賣,
如果線程安全,每個人買到的票都是從1000-1的,不會存在重復問題,
如果線程不安全,就會出現(xiàn)或許兩個人買到的是同一張票(所謂的假數(shù)據)
3.線程安全問題出現(xiàn)的原因?
從上面兩個回答可知,無論是安全不安全,其圍繞的重點也是在線程更改數(shù)據和沒有辦法更改數(shù)據.
由此我們知道,線程安全問題都是由全局變量及靜態(tài)變量引起的。
4.注意:
若每個線程中,對全局變量,靜態(tài)變量只有讀操作,而沒有寫的操作,一般來說,這個全局變量是線程安全的,若有多個線程同事執(zhí)行寫操作,一般需要考慮線程同步,否則的話就有可能影響線程安全.
線程安全的,改變了數(shù)據,只是自己手動改變的,而不是因為線程不安全引起的問題.
5.解決多線程并發(fā)訪問資源的安全問題,有三種方式:
? ??參考自:
? ??1.同步代碼塊
? ? 2.同步方法
? ? 3.鎖機制
? ? 1. ?????????synchronized(同步鎖)
????????????{
????????????????需要同步操作的代碼
? ? ? ? ? ? ?}
? ? ?同步鎖:
? ? ?為了保證每個線程都能正常執(zhí)行原子操作,Java引入了線程同步機制.也稱為同步監(jiān)聽對象/同步鎖/ ? ? ?同步監(jiān)聽器/互斥鎖怎憋。
? ? ?實際上又碌,對象的同步鎖只是一個概念,可以想象為在對象上標記了一個鎖,誰拿到鎖绊袋,誰就可以進 ? ? ?入代碼塊毕匀,其他線程只能在代碼塊外面等著,而且注意癌别,在任何時候皂岔,最多允許一個線程擁有同 ? ? ?步鎖.
? ? Java程序運行可以使用任何對象作為同步監(jiān)聽對象,但是一般的,我們把當前并發(fā)訪問的共同資源 ? ? ? 作為同步監(jiān)聽對象.
2.同步方法:
使用synchronized修飾的方法,就叫做同步方法,保證A線程執(zhí)行該方法的時候,其他線程只能在方法外等著.
Synchronized public void doWork(){
????????///TODO
}
同步鎖是誰:?
對于非static方法,同步鎖就是this.
對于static方法,我們使用當前方法所在類的字節(jié)碼對象(Apple2.class).
注意:
不要使用synchronized修飾run方法,修飾之后,某一個線程就執(zhí)行完了所有的功能.好比是多個線程出現(xiàn)串行.
解決方案:把需要同步操作的代碼定義在一個新的方法中,并且該方法使用synchronized修飾,再在run方法中調用該新的方法即可.
實際上,同步代碼塊和同步方法差不了多少展姐,在本質上是一樣的躁垛,兩者都用了一個關鍵字synchronized,synchronized保證了多線程并發(fā)訪問時的同步操作,避免線程的安全性問題圾笨,但是有一個弊端教馆,就是使用synchronized的方法/代碼塊的性能比不用要低一些,因此如果要用synchronized擂达,建議盡量減小synchronized的作用域土铺。
3.鎖機制
注意lock的位置