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