理解執行緒安全?
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...