锁使用来控制多个线程访问共享资源的方式,一般来说一个锁能够防止多个线程同时访问一个资源;
有synchronized 和 Lock
synchronized 将锁的获取和释放固话了,只有现获取再释放;
1,Lock 包含了synchronized 不具备的功能;
(1)尝试非阻塞的获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取该锁;
(2)能被中断的获取锁:获取锁的线程能够响应中断,当获取到锁的线程被中断的时候,中断异常会被抛出,同时锁会被释放;
(3)超时获取锁:在指定的时间内获取锁,如果时间到了还没获取到锁,那么就会返回;
2,Condition
任意java 对象都有一组moniter监控方法wait(),wait(long timout),notify(),notifyall()方法,这些方法与synchronized关键字配合可以实现等待/通知模式;
condition 接口也提供了类似object的监视方法,与Lock配合实现等待/通知模式;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
/**
* 调用该方法 表示当前线程释放掉锁 并在此处等待
*/
public void conditionAwait(){
lock.lock();
try {
//类似object.wait() 会释放掉当前锁
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
finally {
lock.unlock();
}
}
/**
* 其他线程调用该signal(),通知当前线程从wait()中返回,并且返回前已经获取到了锁
*/
public void conditionSignale(){
lock.lock();
try {
condition.signal();
}finally {
lock.unlock();
}
}
本文详细介绍了Java中的锁机制,包括synchronized和Lock两种方式的区别与使用场景。Lock提供了更多高级功能,如非阻塞获取锁、可中断获取锁及超时获取锁等。此外还介绍了如何利用Condition接口与Lock配合实现等待/通知模式。

被折叠的 条评论
为什么被折叠?



