下面是代碼,我想問的是回圈中的sleep陳述句注釋與不注釋會產生什么影響,我之所以會有這個疑問是因為書上說多個執行緒訪問同一資源時會有執行緒安全問題,例如下面的代碼就可能出現第0張票甚至第-1張票的可能,但是我發現下面的代碼如果沒有sleep就幾乎不會出現差錯,而加上sleep后幾乎次次都會差錯,我一直認為出現差錯就是在while(tickets > 0)這一句的判斷上,如果a執行緒和b執行緒同時運行,此時tickets=1,當a判斷時顯然結果是true,但是當a還沒執行到tickets--這一步時b又進行判斷的,得到的結果也是true,所以會出現0的情況,當然由于執行緒執行速度很快,所以差錯只是偶爾出現,但如果人為的sleep就會提高差錯率,可是如果按照我的想法的話,把sleep放到tickets--后面的話就不會影響了,因為此時的tickets已經變了,但事實證明不像我想的那樣,求指教

這應該和 tickets-- 或 --tickets沒什么關系吧,我都試過了
package ThreadTest;
public class Example05 {
public static void main(String[] args) {
TicketWindow2 tw = new TicketWindow2();
Thread t1 = new Thread(tw, "視窗一");
Thread t2 = new Thread(tw, "視窗二");
Thread t3 = new Thread(tw, "視窗三");
t1.start();
t2.start();
t3.start();
}
}
class TicketWindow2 implements Runnable {
int tickets = 10;
@Override
public void run() {
// TODO Auto-generated method stub
while(tickets > 0) {
System.out.print(Thread.currentThread().getName()+"正在出售第"+tickets-- +"張票!\n");
// try {
// Thread.sleep(10);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/282044.html
標籤:Java SE
上一篇:新手求助jsp連接資料庫
