Java 多線程學習總結2

併發執行最理想的狀況是讓一些“毫不相干”的Somebody自己做自己的事情,和別人無關。但是事實讓確非如此,因爲在哲學上講,世界是一個整體,每個個體之間都存在聯繫,我們讓一些東西不相干,是我們人類爲了簡化問題,而從概念上進行的分割劃分,呵呵。事實上,如果某個Somebody爲多個線程共享,其中的某些域可能成爲公共數據。多線程對公共資源的訪問可能不會按照你的意願。

public class SomeBody {
    private int a,b;
    public SomeBody(int a, int b)
    {
        this.a=a;
        this.b=b;
    }
    //a和b不停地同時增加。
    public void increase()
    {
        while(true)
        {
            a++;
            b++;
           
        }
    }
    //不停地檢查a和b是否相等。
    public void show()
   
    {
        while(true)
        {
        System.out.println("a= "+a+"  b="+b+"a=?b "+(a-b));
        }
    }



}

 

 a和b同時增加的線程:

 

 

 public class Increase extends Thread{
    private SomeBody somebody;
    public Increase(SomeBody somebody)
    {
        this.somebody=somebody;
    }
    
    public void run()
    {
        somebody.increase();
    }

}

 檢查a,b是否相等的線程:

 

public class Show extends Thread{
    private SomeBody somebody;
    public Show(SomeBody somebody)
    {
        this.somebody=somebody;
    }
   
    public void run()
    {
        somebody.show();
    }


}

程序入口:

public class main {
    public static void main(String args[])
    {   SomeBody somebody=new SomeBody(1,1);
        Thread thread1=new Increase(somebody);
        Thread thread2=new Show(somebody);
        thread1.start();
        thread2.start();
       
    }

}

在show方法打了斷點的調試結果:

a= -1988840804  b=-1988840804a=?b 0
a= -14091620  b=-14091620a=?b 0
a= 384001584  b=384001584a=?b 0
a= 778866029  b=778866029a=?b 0
a= 1186839591  b=1186839591a=?b 0
a= 1751989311  b=1751989311a=?b 0
a= -1663360948  b=-1663360949a=?b 1
a= -754997646  b=-754997647a=?b 1
a= -337072596  b=-337072597a=?b 1
a= -78442815  b=-78442816a=?b 1
a= 290940999  b=290940998a=?b 1
a= 662999761  b=662999760a=?b 1
a= 954816967  b=954816967a=?b 0
a= 1388427731  b=1388427730a=?b 1
a= 1881242049  b=1881242049a=?b 0

其原因就是在a和b在increase的時候,a++完畢後,increase線程切換到了show線程,導致a!=b,所以我們需要互斥,下回說說互斥

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章