多執行緒的前提知識,了解本節之前可先看基礎知識一. 本節目標
執行緒安全二. 什麼是執行緒安全問題?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 鎖的是什麼?普通方法synchronized 修飾方法使用鎖是當前this鎖。
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...