并发执行最理想的状况是让一些“毫不相干”的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,所以我们需要互斥,下回说说互斥