多線程——引入同步代碼塊解決窗口賣票產生負票的問題

繼續討論多窗口賣票問題中的線程安全問題: 
方式二: 
java

1、問題: 出現了線程安全問題 ?安全

2、問題的緣由: 
當多條語句在操做同一個線程共享數據時,一個線程對多條語句只執行了一部分,尚未執行完,另外一個線程參與進來執行。致使共享數據的錯誤。多線程

3、出現線程安全問題的根本緣由: 
一、存在兩個或者兩個以上的線程對象,並且線程之間共享着一個資源。 
二、有多個語句操做了共享資源。線程

4、解決辦法: 
一、對多條操做共享數據的語句,只能讓一個線程都執行完。在執行過程當中,其餘線程不能夠參與執行。 
二、線程安全問題的解決方案:sun提供了線程同步機制讓咱們解決這類問題的。code

5、java線程同步機制的方式: 
一、同步代碼塊: 
1)同步代碼塊的格式:對象

synchronized(鎖對象){
    須要被同步的代碼...
}
  • 1
  • 2
  • 3


對象如同鎖。持有鎖的線程能夠在同步中執行。 
沒有持有鎖的線程即便獲取cpu的執行權,也進不去,由於沒有獲取鎖。資源

2)同步代碼塊要注意事項: 
a)任意的一個對象均可以作爲鎖對象。 
b)在同步代碼塊中調用了sleep方法並不釋放鎖對象的。 
c)只有真正存在線程安全問題的時候才使用同步代碼塊,不然會下降效率的。 
d)多線程操做的鎖對象必須是惟一共享的,不然無效。 
同步

6、同步的前提: 
一、必需要有兩個或者兩個以上的線程。 
二、必須是多個線程使用同一個鎖。效率

必須保證同步中只能有一個線程在運行。方法

7、同步代碼塊的利弊:  好處:解決了多線程的安全問題。  弊端:多個線程須要判斷鎖,較爲消耗資源。

相關文章
相關標籤/搜索