Java多執行緒之間實現同步

2021-09-24 16:42:05 字數 4434 閱讀 3460

理解執行緒安全?

synchronized用法

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

案例:需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。

**:

class threadtrain1 implements runnable  catch (interruptedexception e) 

sale();

} }public void sale() catch (exception e)

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--; } }}

public class threaddemo2

}

執行結果:

一號視窗和二號視窗同時**火車第一張和第七張,部分火車票會重複**。

結論發現,多個執行緒共享同乙個全域性成員變數時,做寫的操作可能會發生資料衝突問題。

問:如何解決多執行緒之間執行緒安全問題?
答:使用多執行緒之間同步或使用鎖(lock)。

問:為什麼使用執行緒同步或使用鎖能解決執行緒安全問題呢?

答:將可能會發生資料衝突問題(執行緒不安全問題),只能讓當前乙個執行緒進行執行。**執行完成後釋放鎖,讓後才能讓其他執行緒進行執行。這樣的話就可以解決執行緒不安全問題。

問:什麼是多執行緒之間同步?

答:當多個執行緒共享同乙個資源,不會受到其他執行緒的干擾。

什麼是同步**塊?

答:就是將可能會發生執行緒安全問題的**,給包括起來。

synchronized(同乙個資料)

**樣例:

private object mutex = new object();// 自定義多執行緒同步鎖

public void sale() catch (exception e)

system.out.println(thread.currentthread().getname() + ",** 第" +

(100 - traincount + 1) + "張票.");

traincount--; }

} }

什麼是同步函式?

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

**樣例

public synchronized void sale()  catch (exception e) 

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--;}}

同步函式用的是什麼鎖?答:同步函式使用this鎖。

證明方式: 乙個執行緒使用同步**塊(this明鎖),另乙個執行緒使用同步函式。如果兩個執行緒搶票不能實現同步,那麼會出現資料錯誤。

**:

class threadtrain5 implements runnable  catch (exception e) 

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--;}}

}} else

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

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--;

} }}public class threaddemo5

}

答:什麼是靜態同步函式?

方法上加上static關鍵字,使用synchronized 關鍵字修飾 或者使用類.class檔案。

靜態的同步函式使用的鎖是 該函式所屬位元組碼檔案物件

可以用 getclass方法獲取,也可以用當前 類名.class 表示。

**樣例:

synchronized (threadtrain.class)  catch (exception e) 

}

總結:

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

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

答:同步中巢狀同步,導致鎖無法釋放

**:

class threadtrain6 implements runnable 

}} else

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

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--;

} } }}

public class deadlockthread

}

5.1、設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。寫出程式。

問:什麼是多執行緒安全?

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

問:如何解決多執行緒之間執行緒安全問題?

答:使用多執行緒之間同步或使用鎖(lock)。

問:為什麼使用執行緒同步或使用鎖能解決執行緒安全問題呢?

答:將可能會發生資料衝突問題(執行緒不安全問題),只能讓當前乙個執行緒進行執行。被包裹的**執行完成後釋放鎖,讓後才能讓其他執行緒進行執行。這樣的話就可以解決執行緒不安全問題。

問:什麼是多執行緒之間同步?

答:當多個執行緒共享同乙個資源,不會受到其他執行緒的干擾。

問:什麼是同步**塊?

答:就是將可能會發生執行緒安全問題的**,給包括起來。只能讓當前乙個執行緒進行執行,被包裹的**執行完成之後才能釋放所,讓後才能讓其他執行緒進行執行。

問:多執行緒同步的分類?

1.使用同步**塊?

synchronized(同乙個資料)

private object mutex = new object();// 自定義多執行緒同步鎖

public void sale() catch (exception e)

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--; }

} }

2.使用同步函式在方法上修飾synchronized 稱為同步函式

public synchronized void sale()  catch (exception e) 

system.out.println(thread.currentthread().getname() + ",** 第" + (100 - traincount + 1) + "張票.");

traincount--;}}

3.靜態同步函式方法上加上static關鍵字,使用synchronized 關鍵字修飾 為靜態同步函式

靜態的同步函式使用的鎖是 該函式所屬位元組碼檔案物件

問:同步**塊與同步函式區別?

答:同步**使用自定鎖(明鎖)

同步函式使用this鎖

問:同步函式與靜態同步函式區別?

注意:有些面試會這樣問:例如現在乙個靜態方法和乙個非靜態靜態怎麼實現同步?

答:同步函式使用this鎖

靜態同步函式使用位元組碼檔案,也就是類.class

問:什麼是多執行緒死鎖?

答:同步中巢狀同步

解決辦法:同步中盡量不要巢狀同步

多執行緒之間實現同步

多執行緒的前提知識,了解本節之前可先看基礎知識 一.本節目標執行緒安全 synchronized 用法 死鎖二.什麼是執行緒安全問題?面試遇到這個問題的答法 當多個執行緒同時共享同乙個全域性變數或者靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是若大家都做讀操作是不會發生資...

多執行緒之間同步

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...

多執行緒之執行緒同步

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