tryLock在一定时间内获取不到锁不会一直阻塞,会返回false,然后线程会继续向下走。
package com.iteye.yuanyuan7891.thread.lock;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock
{
public static void main(String[] args)
throws InterruptedException
{
new AThread("A").start();
Thread.sleep(1000);
new AThread("B").start();
Thread.sleep(7000);
new AThread("C").start();
}
}
/**
* 示例线程
*/
class AThread extends Thread
{
public static volatile Lock dbInsertLock = new ReentrantLock();
public static Lock getDbInsertLock()
{
return dbInsertLock;
}
String tName = null;
AThread(String name)
{
super(name);
this.tName = name;
}
@Override
public void run()
{
try
{
System.out.println(tName + "等待锁" + new Date());
if (dbInsertLock.tryLock(3, TimeUnit.SECONDS))
{
// if (dbInsertLock.tryLock(3, TimeUnit.SECONDS)){
// System.out.println(tName+"可重入"+new Date());
// }else{
// System.out.println(tName+"不可重入"+new Date());
// }
try
{
System.out.println(tName + "持有锁" + new Date());
sleep(6000);
System.out.println(tName + "做完了" + new Date());
}
finally
{
dbInsertLock.unlock();
System.out.println(tName + "释放锁" + new Date());
}
}
else
{
System.out.println(tName + "获取不到锁!再见" + new Date());
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
super.run();
}
}
附tryLock方法说明:
boolean tryLock(long time,
TimeUnit unit)
throws InterruptedException
如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
如果锁可用,则此方法将立即返回值 true。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:
锁由当前线程获得;或者
其他某个线程中断当前线程,并且支持对锁获取的中断;或者
已超过指定的等待时间
如果获得了锁,则返回值 true。
如果当前线程:
在进入此方法时已经设置了该线程的中断状态;或者
在获取锁时被中断,并且支持对锁获取的中断,
则将抛出 InterruptedException,并会清除当前线程的已中断状态。
如果超过了指定的等待时间,则将返回值 false。如果 time 小于等于 0,该方法将完全不等待。
实现注意事项
在某些实现中可能无法中断锁获取,即使可能,该操作的开销也很大。程序员应该知道可能会发生这种情况。在这种情况下,该实现应该对此进行记录。
相对于普通方法返回而言,实现可能更喜欢响应某个中断,或者报告出现超时情况。
Lock 实现可能可以检测锁的错误用法,例如,某个调用可能导致死锁,在特定的环境中可能抛出(未经检查的)异常。该 Lock 实现必须对环境和异常类型进行记录。
参数:
time - 等待锁的最长时间
unit - time 参数的时间单位
返回:
如果获得了锁,则返回 true;如果在获取锁前超过了等待时间,则返回 false
抛出:
InterruptedException - 如果在获取锁时,当前线程被中断(并且支持对锁获取的中断)