Java线程同步问题:设备独占

2014-11-24 07:43:14 · 作者: · 浏览: 0


简介
应用场景:如果有一设备,同一时间只能有一个线程访问,并且每次访问都需要等待较长时间来获取设备返回的数据。如果使用排队机制,当大量线程同时访问时,就会出现排队过久的情况。
当然,如果用户愿意等,也没有关系。假如用户不愿意等呢?也就是说:当存在其他线程正在访问设备时,再有线程访问时,就立即返回,并给出提示,免去等待过久的情况。
设计思路:
我们需要两个“锁”:一个锁用户判断设备是否忙,另外一个锁用户保护设备访问的“原子性”操作。
线程体如下:

/*
 * $filename: DeviceThread.java,v $
 * $Date: 2013-12-17  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package edu.njupt.zhb;
/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *GitHub   https://github.com/nuptboyzhb
 *mail:    zhb931706659@126.com
 *2013-12-17  Nanjing,njupt,China
 */
public class DeviceThread extends Thread {
	private static int deviceModel = 0;
	private static boolean isBusy = false;
	private static Object deviceLock = new Object();
	@Override
	public void run() {
		// TODO Auto-generated method stub
		synchronized (deviceLock){
			if(!isBusy){
				isBusy = true;//锁定设备状态
			}else{
				System.out.println(设备正忙...请稍后访问);
				return;//如果不加return,则线程就会进入下一个临界区的争夺
			}
		}
		synchronized (this) {
			deviceModel++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(deviceModel = +deviceModel);
			isBusy = false;//设备访问结束,修改设备状态
		}
	}
}

测试:

/*
 * $filename: TestMain.java,v $
 * $Date: 2013-12-17  $
 * Copyright (C) ZhengHaibo, Inc. All rights reserved.
 * This software is Made by Zhenghaibo.
 */
package edu.njupt.zhb;
/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *GitHub   https://github.com/nuptboyzhb
 *mail:    zhb931706659@126.com
 *2013-12-17  Nanjing,njupt,China
 */
public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        DeviceThread deviceThread = new DeviceThread();
        for (int i = 0; i < 10; i++) {
			Thread thread = new Thread(deviceThread);
			thread.start();
		}
	}

}

运行结果:

设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
设备正忙...请稍后访问
deviceModel = 1