多執行緒共享資料引發的問題
用乙個簡單的例子來說,就是我們經常遇到的過年搶車票的問題,以前人們是去車站排隊,先到先得,現在隨著網際網路的發展,我們可以在網上購票了,現在我們使用多執行緒來模擬搶票過程,每個人機會一樣。
關鍵**如下:
/**
* 執行緒不安全的網路搶票
* */
public
class
site
implements
runnable
//第一步:修改資料
num++
; count--
;try
catch
(interruptedexception e)
//第二步:顯示資訊
system.out.
println
(thread.
currentthread()
.getname()
+"搶到第"
+num+
"張票,剩餘"
+count+
"張票!");
}}}//測試類
public
class
test
}
結果如圖:
看結果顯示如下問題:
不是從第一張票開始
存在多人搶到一張票的情況
有些票號沒有被搶到
這些都是由於多個執行緒併發操作統一共享資源,帶來的資料不安全問題,要解決這樣的問題,我們就需要使用到執行緒同步。
執行緒同步的實現
什麼是執行緒同步
當兩個或多個執行緒需要訪問同一資源時,需要以某種順序來確保該資源某一時刻只能被乙個執行緒使用,這就是執行緒同步
採用執行緒同步來控制線程的執行有兩種方式,即同步帶嗎方法和同步**塊。這兩種方法都是用synchronized關鍵字實現。
通過在方法申明中加入synchronized關鍵字實現同步方法,其語法如下:
訪問修飾符 synchronized 返回型別 方法名(引數列表)
或者synchronized 訪問修飾符 返回型別 方法名(引數列表)
在語法中:
synchronized是同步關鍵字
訪問修飾符是指public,private等。
使用同步方法解決上述**,如下所示:
public
class
site
implements
runnable
//第一步:修改資料
num++
; count--
;try
catch
(interruptedexception e)
//第二步:顯示資訊
system.out.
println
(thread.
currentthread()
.getname()
+"搶到第"
+num+
"張票,剩餘"
+count+
"張票!");}}}
結果如下:
同步方法的缺陷
如果將乙個執行時間較長的方法宣告稱synchronized將會影響效率
同步**塊
語法:synchronized(syncobject)
示例**如下:
public
class
site
implements
runnable
// 第一步:修改資料
num++
; count--
;try
catch
(interruptedexception e)
// 第二步:顯示資訊
system.out.
println
(thread.
currentthread()
.getname()
+"搶到第"
+ num +
"張票,剩餘"
+ count +
"張票!");
}}}}
同步 執行緒同步
操作執行的先後順序。同步指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關係。同步 英語 synchronization 指對在乙個系統中所發生的事件 event 之間進行協調,在時間上出現一致性與統一化的現象。在系統中進行同步,也被稱為及時 in time 同步化的 synchronous...
執行緒的同步
執行緒的同步 用的是訊號燈來實現 1.執行緒訊號燈的初始化 include sem t sem int sem init sem t sem,int pshared,unsigned int value 編譯時後面如 gcc xx.c o xx pthread 功能 訊號燈的初始化 引數 sem 訊...
執行緒同步 執行緒同步跟Runnable的區別
執行緒同步 建立多條執行緒,要一條執行緒執行完run 方法,下乙個執行緒才能進入run 方法,執行緒同步就是為了避免同一條件下不允許多條執行緒同時進入而製造出來的方法。runnable跟同步的區別 runnable在同一條件下可以同時進入多條執行緒,而同步不行,runable資料共享。例子,售票台有...