Java对多线程程序的锁定已经有良好的支持,通常使用synchronized修饰一个方法或者一段代码。但是有一个问题,多个线程同时调用同一个方法的时候,所有线程都被排队处理了。该被调用的方法越耗时,线程越多的时候,等待的线程等待的时间也就越长,甚至于几分钟或者几十分钟。对于Web等对反应时间要求很高的系统来说,这是不可以接受的。本文就介绍一种自己实现的锁定方法,可以在没有拿到锁之后马上返回,告诉客户稍后重试。
某一段程序同一时刻需要保证只能单线程调用,那么策略很简单,最先到的线程获取锁成功,在它释放之前其它线程都会获取失败。首先要构造一个全局的系统锁仓库,代码如下:
/*
* LockStore.java 2012-5-15
*/
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 公用的内存锁仓库. 分为获取锁和释放锁两种操作。
*
* @version 1.0
*/
public final class LockStore {
// volatile保证所有线程看到的锁相同
private static volatile Map<String, Date> locks = new HashMap<String, Date>();
private LockStore() {
}
/**
* 根据锁名获取锁
*
* @param lockName
* 锁名
* @return 是否锁定成功
*/
public synchronized sta