@Override
	//TimeUnit只支持毫秒
	public boolean trylock(long time, TimeUnit unit) throws InterruptedException {
		if(Thread.interrupted()){
			throw new InterruptedException();
		}
		boolean isInterrupted = false;
		long startTime = System.currentTimeMillis();
		long duration = TimeUnit.MILLISECONDS.convert(time, unit);
		// 注意：每次tryLock都要new新的Node，为了同一个线程可以多次获得锁。如果每个线程都使用同一个节点，会影响链中其他的节点
		QNode node = new QNode();
		myNode.set(node);
		// 尝试一次获取锁
		QNode pre = tail.getAndSet(node);
		// 第一个节点或者之前的节点都是已经释放了锁的节点, pre==AVAILABLE表示获得了锁
		if(pre == null || pre == AVAILABLE){
			return true;
		}
		// 在给定时间内对preNode自旋
		while((System.currentTimeMillis() - startTime < duration) && !isInterrupted){
			QNode predPreNode = pre.preNode;
			// 表示前一个节点已经释放了锁，设置了preNode域，否则preNode域为空
			if(predPreNode == AVAILABLE){
				return true;
			}
			// 当prePreNode ！= null时，只有两种情况，就是它超时了，或者被中断了。
			// 跳过prePreNode不为空的节点，继续自旋它的下一个节点
			else if(predPreNode != null){
				pre = predPreNode;
			}
			if(Thread.interrupted()){
				isInterrupted = true;
			}
		}
		
		// 超时或者interrupted，都要设置node的前驱节点不为空
		node.preNode = pre;
		
		if(isInterrupted){
			throw new InterruptedException();
		}
		
		return false;
	}