程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 鎖-JAVA中多線程讀取成員變量的重復問題

鎖-JAVA中多線程讀取成員變量的重復問題

編輯:編程綜合問答
JAVA中多線程讀取成員變量的重復問題

這是個模擬賣票的問題,使用一個對象實現Runnable接口建立四個線程,這個對象有100張票,四個進程同時賣,因為沒使用鎖,所以會出現負數票,但是為什麼會出現相同的票呢?8號票賣了四次,是因為成員變量在if之後進棧保存了值?然後直接用這個num輸出嗎?

代碼:

 class Ticket implements Runnable//extends Thread
{
    private int num = 100       public void run()//這時不能拋出異常,因為覆蓋的原函數沒有拋出異常,必須catch
    {
        while(true)
        {
            if(num>0)
            {
                try{
                    Thread.sleep(2);

                }
                catch(InterruptedException e){}
                System.out.println(Thread.currentThread().getName()+" sale "+num--);
            }
            else break;
        }
    }
}

class Demo
{
    public static void main(String[] args) {
        Ticket t=new Ticket();
        Thread t1=new Thread(t);
        Thread t2=new Thread(t);
        Thread t3=new Thread(t);
        Thread t4=new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

部分輸出

Thread-1 sale 12
Thread-0 sale 13
Thread-0 sale 10
Thread-1 sale 9
Thread-3 sale 9
Thread-2 sale 10
Thread-2 sale 8
Thread-1 sale 8
Thread-0 sale 8
Thread-3 sale 8
Thread-2 sale 7
Thread-1 sale 6
Thread-0 sale 5
Thread-3 sale 4
Thread-2 sale 3
Thread-1 sale 2
Thread-0 sale 1
Thread-3 sale 0
Thread-2 sale -1
Thread-1 sale -2

最佳回答:


System.out和num--是兩個操作(而且這兩個操作還不是原子操作,但這裡先看成原子操作,比較好解釋),那麼,System.out輸出數字後在還沒num--時線程被搶占,搶占成功的另一個線程也執行到System.out,但是依舊還沒執行num--,又被另一個線程搶占,以此類推,就可能得到4個8了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved