繼續討論多窗口賣票問題中的線程安全問題:
方式二:
java
1、問題: 出現了線程安全問題 ?安全
2、問題的緣由:
當多條語句在操做同一個線程共享數據時,一個線程對多條語句只執行了一部分,尚未執行完,另外一個線程參與進來執行。致使共享數據的錯誤。多線程
3、出現線程安全問題的根本緣由:
一、存在兩個或者兩個以上的線程對象,並且線程之間共享着一個資源。
二、有多個語句操做了共享資源。線程
4、解決辦法:
一、對多條操做共享數據的語句,只能讓一個線程都執行完。在執行過程當中,其餘線程不能夠參與執行。
二、線程安全問題的解決方案:sun提供了線程同步機制讓咱們解決這類問題的。code
5、java線程同步機制的方式:
一、同步代碼塊:
1)同步代碼塊的格式:對象
synchronized(鎖對象){ 須要被同步的代碼... }
對象如同鎖。持有鎖的線程能夠在同步中執行。
沒有持有鎖的線程即便獲取cpu的執行權,也進不去,由於沒有獲取鎖。資源
2)同步代碼塊要注意事項:
a)任意的一個對象均可以作爲鎖對象。
b)在同步代碼塊中調用了sleep方法並不釋放鎖對象的。
c)只有真正存在線程安全問題的時候才使用同步代碼塊,不然會下降效率的。
d)多線程操做的鎖對象必須是惟一共享的,不然無效。
同步
6、同步的前提:
一、必需要有兩個或者兩個以上的線程。
二、必須是多個線程使用同一個鎖。效率
必須保證同步中只能有一個線程在運行。方法
7、同步代碼塊的利弊: 好處:解決了多線程的安全問題。 弊端:多個線程須要判斷鎖,較爲消耗資源。