併發執行最理想的狀況是讓一些“毫不相干”的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,所以我們需要互斥,下回說說互斥