从这个代码分析,我猜测不能从理论上保证排除“饥饿”这种现象,但是这种现象是极其罕见的,也是不可能出现的。
如果线程只是傻傻地一个劲的“排他的”前行,那必然是愚蠢的。线程间需要通信,他们需协作才完成某项任务。线程间通常都是各顾各地前行,当然他们有公共资源的时候,需要调成按一定秩序执行。打个比方:福特汽车的流水线,for example,有一个流程是这样的:做好底盘的工人把底盘放在传送带上,传给上轮胎的工人。两个部分的工人只是埋头苦干,大部分时间不需要协调。如果做底盘的工人速度慢了,那么上轮胎的工人就闲着了,要等。如果上轮胎的工人很慢,做底盘的可以喝口水,抽口烟了,呵呵。这和线程很像:只关心自己的事情,但是在"边缘"的地方,双方需要协调。这就需要线程能有"停止"和"再启动"的能力。对应的方法
如果多个线程操作多个对象互相请求,那么会引起死锁。 package deadlock; public class SomeBody { private String name; private SomeBody other; public SomeBody(String name)
在上一篇中,我们当然希望a++,b++执行完之后,show方法再来show.我们需要的是“原子”动作,一次性地把a++,b++不间断地执行。在java中是利用“互斥”的方法,互斥谁呢?互斥的是相同对象的加锁代码。如果我们把第一篇的SomeBody的方法someBodyDo加上关键字synchronized,表面加上了排斥锁,
并发执行最理想的状况是让一些“毫不相干”的Somebody自己做自己的事情,和别人无关。但是事实让确非如此,因为在哲学上讲,世界是一个整体,每个个体之间都存在联系,我们让一些东西不相干,是我们人类为了简化问题,而从概念上进行的分割划分,呵呵。事实上,如果某个Somebody为多个线程共享,其中的某些域可能成为公共数据。多线程对公共资源的访问可能不会按照你的意愿。
Java的线程执行,也是非常简单的,new 一个线程,然后start就OK了。 关于Thread这个类,有时候容易混淆。打个比方说,使用这个类可以类比成英语里面的语法“Somebody do Something”。举个例子:
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号