手撕源码系列之锁 -- LOCK
Lock
Lock 是JDK在1.5版本提供的Java.util.concurrent.locks包下的锁相关内容。
功能是为了补充Sychronized缺乏的相关功能。
关于Sychronized的优劣会在Sychronized内讲解(尚未提供)
源码:
public interface Lock {
/**获取锁 ,如果当前锁被其他线程获取则等待直到获取锁*/
void lock();
/** 功能和lock差不多 , 但是区别点在于在当前线程在等待锁的过程中被中断,那么会退出等待,并抛出中断异常*/
void lockInterruptibly() throws InterruptedException;
/**无参方法,尝试获取锁,并立即返回,返回类型为布尔类型,代表是否获取锁*/
boolean tryLock();
/**含参方法,在一段时间内获取锁,如果期间内被中断则抛出异常*/
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
/** 释放锁 */
void unlock();
/**新建一个绑定在当前Lock方法上的Condition*/
Condition newCondition();
}
Condition对象
Condition 和Lock一样同是在java.util.concurrent.locks目录下的一个对象。Condition是条件队列接口,提供类似于Object监视器方法 ,可与Lock实现等待/通知模式
我们知道Object对象提供了wait、waitAll、notify、notifyAll的方法用来实现线程的同步、等待和唤醒。但Condition类提供了比wait/notify更丰富的功能,Condition对象由lock对象所创建的,同时一个Lock可以创建多个Condition对象,即创建多个对象监听器,这样就可以指定唤醒具体线程,而notify是随机唤醒线程。
Condition源码:
/* 当前线程在接到信息或者中断之前一直保持等待状态 , 中断的时候抛出中断异常*/
void await() throws InterruptedException;
/** 当前线程在接到信息或者中断之前一直保持等待状态 */
void awaitUninterruptibly();
/**含参方法,使当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态*/
long awaitNanos(long nanosTimeout) throws InterruptedException;
/**造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。 */
boolean await(long time, TimeUnit unit) throws InterruptedException;
/**唤醒一个等待线程。*/
void signal();
/**唤醒所有等待线程*/
void signalAll();