多執行緒之間實現同步

2021-10-03 01:59:21 字數 3575 閱讀 2244

多執行緒的前提知識,了解本節之前可先看基礎知識

一. 本節目標
執行緒安全

synchronized 用法

死鎖

二. 什麼是執行緒安全問題?

面試遇到這個問題的答法

當多個執行緒同時共享同乙個全域性變數或者靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是若大家都做讀操作是不會發生資料衝突問題的。

舉例:在火車票的購票視窗,若是只剩下一張票了,兩個售票員點進售票系統同時準備售賣這張票,a售票員先將這張票賣掉了,b售票員那邊沒有及時更新,這就導致最後一張票賣了兩次,這就是執行緒不安全的例子

三. 執行緒安全解決辦法

在乙個售票系統中有100 張票,兩個執行緒售賣

3.1 使用同步**塊

synochronized(同一資料)

例項1

package sin_2020_02_21;

class threadtrain implements runnable catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+

",**的第 "+ (100 - count + 1) +" 張票");

count--;}}

}/**

* 模擬線程不安全問題。

* 什麼是執行緒不安全?

* 當多個執行緒同時操作同乙個共享的全域性變數,可能會收到其他執行緒的干擾,會發生衝突問題

* */

public class threaddemo

}

例項1結果

例項2

class threadtrain implements runnable catch (interruptedexception e) 

synchronized(ob) }}

}}

例項2結果

3.2 使用同步函式

在方法上修飾 synchronized 稱為同步函式

class threadtrain implements runnable

}public synchronized void sale() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() +

",**的第 " + (100 - count + 1) + " 張票");

count--;}}

}

同步函式用的時 this 鎖3.3 靜態同步函式

在靜態函式中,使用 synchronized 關鍵字時,鎖的是 類.class 檔案。

synchronized (threadtrain.class)  catch (exception e) 

}

總結:

synchronized 修飾方法使用鎖是當前this鎖。

synchronized 修飾靜態方法使用鎖是當前類的位元組碼檔案

synchronized 鎖的是什麼?普通方法

this 指向的物件中的鎖

靜態方法

方法所在類的鎖

**塊括號裡的引用指向的物件

四. 多執行緒死鎖

什麼是多執行緒死鎖

答:同步中巢狀同步,匯入鎖無法釋放

鎖在**執行完成後,就自動釋放。但是所有兩個執行緒,他們在執行的時候,a拿了鎖 1,b 拿了鎖2,但在執行中a執行緒,下一把應該加的鎖2,還沒有被釋放,而執行緒b若是要釋放2這把鎖,需要a執行緒手中的1這把鎖。此刻a,b兩個執行緒就處於一種死鎖狀態。

五. 其他面試題

六. 補充:

1. 其他保證執行緒安全的機制

synchronized 之前學過了

下邊是volatile關鍵字

比 synchronized 輕量級

基本資料型別變數被賦值:

boolean,byte,short,int,char,float

字面量是原子的

long,double

變數任何情況下都不是原子

不是原子性的資料在使用 volatile 修飾後,可具有原子性

基本通訊在下一節學習

2. 單例模型(懶漢模型)

version1

public

class

singletonlazyversion1

private

static singletonlazyversion1 instance = null;

// getinstance 被第一次呼叫時,意味著有人需要 instance

// 再進行初始化

public

static singletonlazyversion1 getinstance()

// 原子結束

return instance;

}}

version2

// 執行緒安全版本的懶漢單例

public

class

singletonlazyversion2

private

static singletonlazyversion2 instance = null;

public

synchronized

static singletonlazyversion2 getinstance()

return instance;

}}

version3(最終版本)

public

class

singletonlazyversion3

private

volatile

static singletonlazyversion3 instance = null;

// a

private

static singletonlazyversion3 getinstance()

}}return instance;

}}

多執行緒通訊(包括生產者-消費者模型)

多執行緒之間同步

1 posix訊號量 includeint sem init sem t sem,int pshared,unsigned int value int sem destroy sem t sem int sem wait sem t sem sem trywait sem t sem int sem...

Java多執行緒之間實現同步

理解執行緒安全?synchronized用法 死鎖當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。案例 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。class thre...

多執行緒之執行緒同步

pulse lockobj 表示釋放當前被lock的lockobj,容許其他執行緒呼叫。相當於暫時掛起當前執行緒 wait lockobj 表示等待當前被其他執行緒占用的lockobj。下面的 將會交替執行兩個執行緒 class ticktock console.write tick monitor...