示例一:
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 ...