简介
Lock是JAVA1.6引入的,对锁具有可操作性。可以手动的获取和释放锁,也可以获取中断和超时的锁。但是与synchronized比起来较为复杂
1、lock
lock方法可获取锁对象,在未拿到锁时会一会处于等待的状态,需要与 unlock方法成对使用,且unlock方法必须执行,经常放在 finally中执行
2、tryLock
tryLock也可以获得锁对象,但是返回的是一个布尔值,拿到了返回true,没有拿到则返回false并且停止等待, 如:
private static Lock lock = new ReentrantLock(); // ReentrantLock是Lock的子类
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
testLock(Thread.currentThread());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
static void testLock(Thread thread) throws InterruptedException {
if (lock.tryLock(2,TimeUnit.SECONDS)){
try {
System.out.println("线程"+thread.getName()+"获得了锁");
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("线程"+thread.getName()+"释放了锁");
lock.unlock();
}
}
}
结论:
可以看到3秒内有五个线程都访问了testLock方法,但是只有一个线程获得了锁,其他的线程在2秒内没有获得锁并且没有再继续等待!
说 明:本文较为简略,如有不足,烦请各位指正,感谢!
邮箱联系:gitboy@sina.com
1465933645@qq.com