同步與死鎖

2021-09-28 20:49:38 字數 2482 閱讀 8192

乙個多執行緒的程式如果通過 runnable 介面實現,則意味著類中的屬性可被多個執行緒共享,那麼在實際應用中,比如賣票程式,在網路延遲等情景下,就有可能出現問題。即多個執行緒物件同時操作同一共享資源

class

mythread

implements

runnable

catch

(interruptedexception e)

system.out.

println

("賣票:ticket = "

+ ticket--);

//賣票}}

}}public

class

runnabledemo03

}

程式執行結果:

觀察程式結果發現,執行的最後出現了負數的情況,為什麼會產生這樣的問題呢?

以上程式執行分為兩個步驟:(1)、判斷是否票數大於0,大於0則可賣 (2)進行票數減1

但在這兩個步驟之間加入了延遲

當多個執行緒物件對同乙個共享資源進行操作,有可能乙個執行緒物件還未進行減1操作時,另乙個執行緒物件也取出同一資源進行操作,這樣一來就會出現票數為負的情況

要想解決這樣的問題,就必須使用同步。所謂同步就是指多個操作在同一時間段內只能有乙個執行緒進行,其它執行緒要等待此執行緒完成之後才可繼續執行

解決資源共享的同步操作,可以使用同步**塊同步方法兩種方式完成

1 、同步**塊
**塊 是指使用 「 {} 」括起來的一段**,根據位置不同,**塊可分為普通**塊,構造塊,靜態**塊。如果在**塊上加上 synchronized 關鍵字,則此**塊就稱為同步**塊【格式】

synchronized (同步物件)

class

mythread

implements

runnable

catch

(interruptedexception e)

system.out.

println

("賣票:ticket = "

+ ticket--);

//賣票}}

}}}public

class

runnabledemo03

}

程式執行結果:

以上**將賣票操作進行同步,所以不會出現賣出票數為負數的情況

2 、同步方法

使用 synchronized 關鍵字 將乙個方法宣告為同步方法

class

mythread

implements

runnable

}public

synchronized

void

saleticket()

catch

(interruptedexception e)

system.out.

println

("賣票:ticket = "

+ ticket--);

//賣票}}

}public

class

runnabledemo03

}

程式執行結果:

同步可以保證資源共享操作的正確性,但是過多同步也會產生問題。例如:a想要b手中的鉛筆,b想要a手中的橡皮檫,a對b說:「你把你的鉛筆給我,我就給你橡皮檫」,而b對a說:「你把你的橡皮檫給我,我就把鉛筆給你」,此時,雙方都在等待對方的操作,這樣一直僵持下去,這就是死鎖的概念

所謂的死鎖是指兩個執行緒都在等待彼此完成,造成程式的停滯

多個執行緒共享同乙個資源需要進行同步,以保證資源操作的完整性,但是過多的同步就有可能產生死鎖

執行緒同步與死鎖

執行緒同步與死鎖 課程大綱 一 多執行緒共享資料 1 在多執行緒的操作中,多個執行緒有可能同時處理同乙個資源,這就是多執行緒中的共享資料。二 執行緒同步 1 解決資料共享問題,必須使用同步,所謂同步就是指多個執行緒在同乙個時刻只能有乙個執行緒執行指定 其他執行緒要等到該執行緒執行結束之後才能繼續執行...

執行緒 同步與死鎖

一,本章目標 了解執行緒同步的作用 了解同步 塊及同步方法的作用 了解死鎖的產生 二,具體內容 說明 在多執行緒的開發中,同步與死鎖的概念是非常重要的,一定要掌握以下幾點 那裡需要絨布 如何實現同步,了解即可 實現同步之後有什麼 問題引出 以賣火車票為例,如果想買火車票,可以去火車站購買或者去各個售...

執行緒死鎖與同步

同步死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。當系統中供多個程序共享的資源如印表機,其數目不足以滿足各個程序的需要時,會引起各個程序對...