累嗎?累就對了,說明你還活著
公平鎖:是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,先來後到。
非公平鎖:是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,有可能會造成優先順序反轉或者飢餓現象
並發包中reentrantlock的建立可以指定建構函式boolean型別來得到公平鎖或非公平鎖,預設是非公平鎖
/**
* creates an instance of .
* this is equivalent to using .
*/public reentrantlock()
/*** creates an instance of with the
* given fairness policy.
** @param fair if this lock should use a fair ordering policy
*/public reentrantlock(boolean fair)
兩者區別
指的是同一執行緒外層函式獲得鎖之後,內層遞迴函式仍然能獲取該鎖的**,在同乙個執行緒在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖
也就是說,執行緒可以進入任何乙個它已經擁有的鎖所同步著的**塊
class phone implements runnable
public synchronized void sendemail()
lock lock = new reentrantlock();
@override
public void run()
public void get() catch (exception e) finally
}public void set() catch (exception e) finally
}}
phone phone = new phone();
new thread(() -> catch (exception e)
},"t1").start();
new thread(() -> catch (exception e)
},"t2").start();
sychoronized可重入鎖結果:
t1 invoked sendsms() t1執行緒在外層方法獲取鎖的時候
t1 ########invoked sendemail() t1在進入內層方法會自動獲取鎖
t2 invoked sendsms()
t2 ########invoked sendemail()
process finished with exit code 0
thread t3 = new thread(phone,"t3");
thread t4 = new thread(phone,"t4");
t3.start();
t4.start();
reentrantlock可重入鎖結果:
t3 invoked get()
t3 invoked set()
t4 invoked get()
t4 invoked set()
process finished with exit code 0
指嘗試獲取鎖的執行緒不會立即阻塞,而是採用迴圈的方式去嘗試獲取鎖,這樣的好處是減少執行緒上下文的消耗,缺點是迴圈會消耗cpu
實現乙個自旋鎖
自旋鎖好處:迴圈比較獲取直到成功為止,沒有類似wait的阻塞
通過cas操作完成自旋鎖,a執行緒先進來呼叫mylock方法自己持有鎖5秒,b隨後進來後發現
當前有執行緒持有鎖,不是null,所以只能通過自旋等待,直到a釋放鎖後b隨後搶到
public class spinlockdemo
}public void myunlock()
public static void main(string args) catch (interruptedexception e)
spinlockdemo.myunlock();
},"aa").start();
try catch (interruptedexception e)
new thread(() -> ,"bb").start();
}}
結果
aa come in
bb come in
aa invoked myunlock()
bb invoked myunlock()
process finished with exit code 0
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...
Java併發 多執行緒
執行緒狀態 每個執行緒可以看做不同的任務,cpu需要分配每個執行緒不同的使用時間,cpu需要不同的執行緒之間來回切換,造成執行緒可能存在的不同狀態。新建執行緒 public class thread1 extends thread public class runnable1 implements ...
JAVA多執行緒 執行緒的同步與鎖
執行緒的同步與鎖 l 執行緒的同步是為了防止多個執行緒訪問乙個資料物件時,對資料造成的破壞。1 執行緒同步的目的是為了保護多個執行緒反問乙個資源時對資源的破壞。2 執行緒同步方法是通過鎖來實現,每個物件都有且僅有乙個鎖,這個鎖與乙個特定的物件關聯,執行緒一旦獲取了物件鎖,其他訪問該物件的執行緒就無法...