首先做个宣传:
http://vote.blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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