共享受限资源

你可以把单线程程序当作在问题域求解的单一实体,每次只能做一件事情。因为只有一个

实体,所以你永远不用担心诸如“两个实体试图同时使用同一个资源”这样的问题,比如:

两个人在同一个地方停车,两个人同时走过一扇门,甚至是两个人同时说话。

 

在多线程的环境中,可以同时做多件事情。但是,“两个或多个线程同时使用同一个受限资

源”的问题也出现了。必须防止这种资源访问的冲突,否则,就可能发生两个线程同时试图

访问同一个银行帐户,向同一个打印机打印,改变同一个值等诸如此类的问题。

 

 

不正确地访问资源

 

 

考虑下面的例子,这里的类“保证”当你调用getValue( )方法时,总能返回一个偶数。同

时,另外一个名为“Watcher”的线程不断调用getValue( )方法并检查返回值是否真的

为偶数。这看起来好像没什么意义,因为从代码上看,返回值显然是偶数。但这恰恰是令

人惊奇之处。下面是该程序的第一个版本:

 

//: c13:AlwaysEven.java

// Demonstrating thread collision overresources by

// reading an object in an unstableintermediate

state.

 

public     class AlwaysEven {

private      int i;

public     void next() { i++; i++; }

public     int getValue() {            return i; }

public     static       void main(String[] args) {

final AlwaysEven ae =           new AlwaysEven();

newThread("Watcher") {

public     void run() {

while(true){

intval = ae.getValue();

if(val% 2 != 0) {

           System.out.println(val);

           System.exit(0);

         }

       }

      }

   }.start();

while(true)

     ae.next();


 

 

 

  }

///:~

 

在main( )中,建立了一个AlwaysEven对象,它必须是final的,因为它要被一个继承

自Thread的匿名内部类所访问。如果线程读出的值不是偶数,它将把这个值打印出来(以

证明它捕获了对象的不稳定状态)并退出程序。

 

这个例子表明了使用线程会遇到的基本问题。你永远不会知道线程是何时运行的。想象一

下,你坐在座子旁边,手里有一把叉子,准备叉起盘子里最后一块食物,当叉子碰到食物

的时候,它忽然消失了(因为你的线程被挂起,另一个线程跑进来偷走了食物)。这就是

你在写并发程序时要面临的问题。

 

你试图使用一个资源的同时,有时并不关心它是否正在被访问(比如别的盘子里的食物)。

但为了让多线程能工作,你就需要某种方法来防止两个线程访问同一个资源,至少是在某

个关键时间段内避免此问题。

 

要防止这类冲突,只要在线程使用资源的时候给它加一把锁就行了。访问资源的第一个线

程给资源加锁,接着其它线程就只能等到锁被解除以后才能访问资源,这时某个线程就可

以对资源加锁以进行访问。如果把汽车的前排座椅看成是受限资源的话,那么你的小孩大

喊一声“我要坐”,就相当于在声明上锁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值