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

首先做个宣传:

2013年度博客之星,希望大家为我投宝贵的一票:

http://vote.blog.csdn.net/blogstaritem/blogstar2013/NUPTboyZHB


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

/*
 * $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


更多阅读:
[1]synchronized与ReentrantLock 的使用:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html
[2]Java线程面试50题:http://www.importnew.com/12773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值