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,所以我们需要互斥,下回说说互斥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值