兩個lock的經典使用示例

2021-08-15 22:03:11 字數 1938 閱讀 2916

示例一:

public class numberprintdemo  catch (interruptedexception e) 

// 當state=1時, 輪到執行緒1列印5次數字

for (int j = 0; j < 5; j++)

system.out.println();

// 執行緒1列印完成後, 將state賦值為2, 表示接下來將輪到執行緒2列印

state = 2;

// notifyall()方法喚醒在pn上wait的執行緒2和執行緒3, 同時執行緒1將退出同步**塊, 釋放pn鎖.

// 因此3個執行緒將再次競爭pn鎖

// 假如執行緒1或執行緒3競爭到資源, 由於state不為1或3, 執行緒1或執行緒3將很快再次wait, 釋放出剛到手的pn鎖.

// 只有執行緒2可以通過state判定, 所以執行緒2一定是執行下次列印任務的執行緒.

// 對於執行緒2來說, 獲得鎖的道路也許是曲折的, 但前途一定是光明的.

pn.notifyall();}}

}},"執行緒1").start();

new thread(new runnable() catch (interruptedexception e)

for (int j = 0; j < 5; j++)

system.out.println();

state = 3;

pn.notifyall();}}

}},"執行緒2").start();

new thread(new runnable() catch (interruptedexception e)

for (int j = 0; j < 5; j++)

system.out.println();

state = 1;

pn.notifyall();

} }

}},"執行緒3").start(); }

}

示例二:

public class numberprint implements runnable 

lock.lock();

while (state != 1)

try catch (interruptedexception e)

// 如果執行緒1競爭到了lock, 也通過了state判定, 將執行列印任務

for (int j = 0; j < 5; j++)

system.out.println();

// 列印完成後將state賦值為2, 表示下一次的列印任務將由執行緒2執行

state = 2;

// 喚醒在c2分支上wait的執行緒2

c2.signal();

} finally }}

}, "執行緒1").start();

new thread(new runnable() catch (interruptedexception e)

for (int j = 0; j < 5; j++)

system.out.println();

state = 3;

c3.signal();

} finally }}

}, "執行緒2").start();

new thread(new runnable() catch (interruptedexception e)

for (int j = 0; j < 5; j++)

system.out.println();

state = 1;

c1.signal();

} finally }}

}, "執行緒3").start();

}public static void main(string args)

}

兩個經典的執行緒安全示例分析

slf4j topic c.case1 public class case1 public static void main string args list.add t t.start 使得每個執行緒執行結束 list.foreach t catch interruptedexception e ...

兩個經典的Oracle觸發器示例

案例一 題目 觸發器 新增員工資訊,流水號作為自動編號 通過序列生成 並且判斷如果工資小於0,則改為0 如果大於10000,則改為10000。create table emp2 e id number,e no number,e name varchar2 20 e sal number selec...

兩個經典的Oracle觸發器示例

from 案例一 題目 觸發器 新增員工資訊,流水號作為自動編號 通過序列生成 並且判斷如果工資小於0,則改為0 如果大於10000,則改為10000。create table emp2 e id number,e no number,e name varchar2 20 e sal number ...