1.背景
建立個視窗賣票,總票數為100張,(應該會有4段**演示)
1.問題:賣票過程中,出現了重票,錯票–>執行緒安全問題
2.出現的原因:當某個執行緒操作車票的過程中,尚未操作完成時,其他執行緒參與進來,也操作車票
3.如何解決?
執行緒a操作ticket的時候,其他執行緒不能參與進來,直到執行緒a操作完ticket時,其他執行緒才可以開始操作ticket,這時,即使執行緒a出現了阻塞,也不能被改變。
解決方案:同步機制
方式一:同步**塊
synchronized
(同步監視器)
說明:
1.被同步的**也就是操作共享資料的**
2.共享資料:多個執行緒共同操作的資料,需要使用同步機制將操作共享資料的**包起來,不能包多了,也不能包少了。
3.同步監視器:俗稱鎖。任何乙個類的物件都可以是鎖
要求就是:多個執行緒必須要共用同一把鎖。
補充:
1.在實現runnable介面建立多執行緒的方式中,可以用this充當同步監視器。
2.在繼承thread類建立多執行緒的方式中,慎用this充當同步監視器,一般用當前類充當。
使用同步**塊解決繼承thread類的方式的執行緒安全問題
class
window
extends
thread
catch
(interruptedexception e)
system.out.
println
(getname()
+": 賣票,票號為 :"
+ ticket)
; ticket--;}
else}}
}}public
class
windowtest
}
使用同步**塊解決實現runnable介面的方式的執行緒安全問題
class
window1
implements
runnable
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+":賣票,票號為"
+ ticket)
; ticket--;}
else}}
}}public
class
windowtest1
}
方式二:同步方法
如果操作共享資料的**完整的宣告在乙個方法中,我們不妨將此方法宣告同步的。
關於同步方法的總結
1.同步方法仍然涉及到同步監視器,只是不需要顯式的宣告。
2.非靜態的同步方法,同步監視器是:this
靜態的同步方法,同步監視器是:當前類本身
使用同步方法來處理繼承thread類的執行緒安全問題
class
window
extends
thread
}public
static synchonized void
show()
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+": 賣票,票號為 :"
+ ticket)
; ticket--;}
}}public
class
windowtest
}
使用同步方法解決實現runnable介面的執行緒安全問題
class
window2
implements
runnable
}private
synchronized
void
show()
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+":賣票,票號為"
+ ticket)
; ticket--;}
}}public
class
windowtest2
}
方式三:lock鎖
優先使用順序
lock->同步**塊(已經進入了方法體,分配了相應資源)->同步方法(方法體外)
class
window
implements
runnable
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+":售票,票號為:"
+ ticket)
; ticket--;}
else}}
finally}}
}public
class
locktest
}
面試題:如何解決執行緒安全問題?有幾種方式?
使用同步機制,有三種。
**面試題:**synchronized 與 lock的異同?
同:二者都可以解決執行緒安全問題。
異:sychronized機制在執行完相應的同步**之後,自動的釋放同步監視器,而lock則需要手動啟動同步(lock()),同時結束同步也需要手動的實現(unlock())
使用同步機制將單例模式中的懶漢式改寫為執行緒安全的
public
class
banktest
class
bank
private
static bank instance = null;
public
static bank getinstance()
}}return instance;
}}
多執行緒筆記 2
物件及變數的併發訪問 1 synchronized 同步方法 多執行緒對同乙個物件中的例項變數進行併發訪問的時候產生的後果就是髒讀,而執行緒安全就是要同步獲取例項變數 2 synchronized 鎖是物件鎖,兩個執行緒分別訪問同乙個類的兩個不同物件的同乙個方法,效果是非同步執行的。3關鍵字sync...
C 關於多執行緒的筆記
thread thnetwork thnetwork new thread new threadstart getnetworkinfo 建立乙個執行緒 thnetwork.start 執行當前執行緒 public void getnetworkinfo 其中getnetworkinfo是新執行緒的...
多執行緒筆記2(執行緒與鎖)
一 同步方法 由於我們可以通過private關鍵字來保證資料物件只能被方法訪問,所以我們只需要針對方法提出一套機制,這套機制就是synchronized關鍵字,他包括兩種用法 synchronized方法和synchronized塊 同步方法 public synchronized void met...