我們通過**來了解一下,下面是乙個模擬賣票的案例,
首先我們先定義乙個票ticked類實現runnable介面:
然後定義乙個測試類:模擬三個視窗賣票class
ticket
implements
runnable
catch
(interruptedexception e)
ticked--
; system.out.
println
("賣了一張票,還剩"
+ ticked +
"張票");
}else}}
}
執行一下看效果:public
class
test1
}
可以看到我們的餘票有兩次剩餘兩張,還出現了餘票為負數的情況,這就是執行緒安全問題,那麼為什麼會出現執行緒安全問題呢?
這是因為:多執行緒操作共享資料時,導致共享資料出錯。
那麼怎麼解決這個問題呢?
有三種方法:
我們先看第一種:使用同步**塊
只需要將操作共享資料的**放在 synchronized 裡面就可以了
class
ticket
implements
runnable
catch
(interruptedexception e)
ticked--
; system.out.
println
("賣了一張票,還剩"
+ ticked +
"張票");
}else}}
}}
同步鎖是誰?再來看一下執行結果:完全沒有問題對於非 static 方法,同步鎖就是 this
對於 static 方法,我們使用當前方法所在類的位元組碼物件(類名.class)
第二種:將操作共享資料的**抽取出來放到乙個方法裡面就可以了
執行看效果:是不是也完全沒問題class
ticket
implements
runnable
}private
synchronized
void
sellticked()
catch
(interruptedexception e)
ticked--
; system.out.
println
("賣了一張票,還剩"
+ ticked +
"張票");}}}
第三種:使用lock鎖,用法其實與第一種差不多,我們看**:
class
ticket
implements
runnable
catch
(interruptedexception e)
ticked--
; system.out.
println
("賣了一張票,還剩"
+ ticked +
"張票");
}else
lock.
unlock()
;}}}
Java非執行緒安全問題的解決方法
在上節 多執行緒之間訪問例項變數 現了乙個術語 非執行緒安全。非執行緒安全主要是指多個執行緒對同乙個物件中的同乙個例項變數進行操作時會出現值被更改 值不同步的情況,進而影響程式的執行流程。下面用乙個示例來學習一下如何解決非執行緒安全問題。本案例模擬了多執行緒下的使用者登入驗證功能。首先編寫乙個類實現...
執行緒安全問題出現的原因和解決方法
執行緒安全問題 執行緒安全出現的根本原因 1.存在兩個或者兩個以上的執行緒物件共享同乙個資源 2.多執行緒操作共享資源 有多個語句。執行緒安全問題的解決方案 2個 方式一 同步 塊 格式 synchronize 鎖物件 同步 塊需要注意的事項 1.鎖物件可以是任意的乙個物件 2.乙個執行緒在同步 塊...
解決執行緒安全問題
一 1 同步 塊 解決runnable的執行緒安全問題 格式 synchronized 同步監視器 被同步的 操作共享資料的 共享資料 多個執行緒共同操作的變數 同步監視器 俗稱鎖,任何乙個類的物件都可以充當鎖。同步監視器中可以用this充當鎖 2 解決繼承thread類的執行緒安全問題 synch...