執行緒的同步與死鎖

2021-09-08 18:49:12 字數 3395 閱讀 5596

在多執行緒中,同步與死鎖概念很重要,在本章中必須了解以下幾點:

1)**需要同步。

2)如何實現同步,了解**即可。

3)及實現同步後有哪些***。

**並不要求可以完整編寫,但是概念必須清楚。

以買火車票為例,不管多少地方可以買火車票,最終一趟列車的車票數量是固定的,如果把各個售票點理解為執行緒的話,則所有執行緒應該共同擁有同乙份票數。

package

thread1;

class mythread implements

runnable}}

};public

class

demo1

};

執行結果:

賣票:ticket = 5賣票:ticket = 3賣票:ticket = 2賣票:ticket = 1賣票:ticket = 4
因為網路操作可能會有延遲,所以這裡增加乙個延遲操作sleep();修改如下;

package

thread1;

class mythread implements

runnablecatch(interruptedexception e)system.out.println("賣票:ticket = " + ticket--);}}

}};public

class

demo1

};

執行結果:

賣票:ticket = 5賣票:ticket = 3賣票:ticket = 4賣票:ticket = 2賣票:ticket = 1賣票:ticket = 0賣票:ticket = -1
此時結果發現賣出的票數成負數,程式**出現問題。

要解決這種問題就要使用同步,所謂同步就是指多個操作在同一時間段內只能有乙個執行緒進行,其他執行緒要等這個執行緒完成之後才能繼續執行

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

之前已經介紹過**塊分四種

1)普通**塊,直接定義在方法中。

2)構造塊,是直接定義在類中,優先於構造方法執行,重複呼叫

3)靜態塊,是使用static關鍵字宣告的,優先於構造塊執行,只執行一次

4)同步**塊,使用synchronized關鍵字宣告的**塊,叫做同步**塊。

syschronized

同步**塊的格式:

synchronized

(同步物件)

同步的時候必須指明同步的物件一般情況下,會將當前物件作為同步物件,使用this表示

package

thread1;

class mythread implements

runnablecatch

(interruptedexception e)

system.out.println("賣票:ticket = " + ticket--);

}}}

}};public

class

demo1

};

執行結果:

賣票:ticket = 5賣票:ticket = 4賣票:ticket = 3賣票:ticket = 2賣票:ticket = 1
從執行結果可以發現,程式加入了同步操作,所以不會產生負數的情況,但是程式的執行效率明顯降低很多。

使用了synchronized宣告的方法為同步方法。

同步方法定義格式:

synchronized

方法返回值型別 方法名稱(引數列表)

同步方法解決如下:

package

thread1;

class mythread implements

runnable

}public

synchronized

void sale()catch

(interruptedexception e)

system.out.println("賣票:ticket = " + ticket--);}}

};public

class

demo1

};

執行結果:

賣票:ticket = 5賣票:ticket = 4賣票:ticket = 3賣票:ticket = 2賣票:ticket = 1
資源共享時候需要進行同步操作。程式中過多的同步會產生死鎖

死鎖一般情況下就是表示互相等待,是在程式執行時候出現的一種文體。

下面通過乙個**來模擬一下死鎖的概念,本**讀者只需了解其效果即可,對於**不必深入了解。

package

thread1;

class zhangsan

public

void

get()

};class lisi

public

void

get()

};public

class demo1implementsrunnable

catch

(interruptedexception e)

synchronized

(ls)}}

else

catch

(interruptedexception e)

synchronized

(zs)}}

}public

static

void

main(string args)

};

執行結果:

張三對李四說:「你給我畫,我就把書給你。」

李四對張三說:「你給我書,我就把畫給你」

此時雙方說完話都在等待對方回應,此時處於停滯狀態,都在互相等待著對方回答。

執行緒同步與死鎖

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

執行緒 同步與死鎖

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

執行緒死鎖與同步

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