锁上可能出现的问题

下面的这段程序模拟了一个小车间。程序首先启动了一个工人线程,该线程在停
止时间到来之前会一直工作(至少是假装在工作),然后程序安排了一个定时器
任务(timer task)用来模拟一个恶毒的老板,他会试图阻止停止时间的到来。
最后,主线程作为一个善良的老板会告诉工人停止时间到了,并且等待工人停止
工作。
首先这个程序我做了修改,使之能够达到目的,同时在源程序中有注释说明了一种一种不正确的方法 

 

 

package com.yinbodotcc;
/*
 *
 * 如果方法的声明形式时用synchronized做用与方法名上,则这题需要提醒你:
 * join();方法会释放Worker线程的锁,因为join方法的背后是wait。
 * 所以那样的话,这里的员工永远不知道quittingTime为true,即"Beer is good"不会被打印出来
 *
 *
 */

import java.util.*;
public class Worker extends Thread
{
 private final static Object lock=new Object();
 private volatile boolean quittingTime = false;
 public void run()
 {
  while (!quittingTime)
   pretendToWork();
  System.out.println("Beer is good");
 }
 private void pretendToWork()
 {
  try {
   Thread.sleep(300); // Sleeping on the job?
   }
  catch (InterruptedException ex) { }
 }

 void quit() throws InterruptedException
 {
  synchronized(lock)
  {
   quittingTime = true;
   join();
  }
 }

 void keepWorking()
 {
  synchronized(lock)
  {
   quittingTime = false;
  }
 }
 public static void main(String[] args) throws InterruptedException
 {
  final Worker worker = new Worker();
  worker.start();
  Timer t = new Timer(true); // Daemon thread
  t.schedule(new TimerTask() {
   public void run() { worker.keepWorking(); }}, 500);
  Thread.sleep(400);
  worker.quit();
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值