LockSupport详解 ReentrantLock详解 Condition详解 wait和notify

2017-02-28 22:01:00
admin
原创 1562
摘要:LockSupport详解 ReentrantLock详解 Condition详解 wait和notify

一、LockSupport详解

函数说明:

1、void park(),无限等待,函数返回有三种情况:得到许可、线程被中断、无缘无故地返回;

2、void parkNanos(long nanos),等待某个时间间隔,可以检查是被中断还是因为超时不再等待;
3、void parkUntil(long deadline),等待某个时间点,可以检查是被中断还是因为超时不再等待;

4、void unpark(Thread thread),给线程许可,如果线程没有启动或参数为空则操作无效;

5、所有park函数都有带参数blocker的重载版本,blocker用于监控或诊断,在park前设置,在park结束时清除;

6、Object getBlocker(Thread thread),获取导致线程休眠的blocker;


使用详解:

1、LockSupport是低级别的接口,应用编程不建议使用;

2、park可能无缘无故返回,所以park一般位于循环;

3、许可不会叠加,所以许可最多只有一个;

4、许可可以先有,unpark先调用或后调用都没关系;


二、ReentrantLock详解

函数说明:

1、void lock(),尝试获取锁,不可以被中断;

2、void lockInterruptibly(),尝试获取锁,被中断时抛出异常InterruptedException,并清除中断标志;

3、boolean tryLock(long timeout, TimeUnit unit),非公平锁保持不公平,公平锁保持公平;

4、boolean tryLock(),抢占式获取锁,不管其它线程是否在等待;

5、void unlock(),释放锁资源;

6、boolean isHeldByCurrentThread(),当前线程是否持有锁;

7、int getQueueLength(),返回正在等待锁的线程数;

8、boolean hasQueuedThreads(),是否有线程在等待锁;


使用详解:

1、ReentrantLock主要是为了替代synchronized;

2、具备重入性,持有锁的线程可以访问其它同步方法;

3、尝试获取锁tryAcquire:非公平锁没有被占有,则占有锁,公平锁没有被占有并且线程位于队列头部,则占有锁;

4、非公平锁效率高,非公平锁不入队列也有获取锁的机会;

5、非公平锁和公平锁都有等待队列,都是通过AbstractQueuedSynchronizer实现;


三、Condition详解

函数说明:

1、void await(),释放锁并使线程休眠,唤醒线程三种方法:signal和signalAll、线程被中断、无缘无故地返回;

2、void awaitUninterruptibly(),释放锁并使线程休眠,不可被中断;

3、boolean await(long time, TimeUnit unit),释放锁并使线程休眠,最多等待指定时间间隔;

4、long awaitNanos(long nanosTimeout),释放锁并使线程休眠,最多等待指定时间间隔;

5、boolean awaitUntil(Date deadline),释放锁并使线程休眠,最多等待到指定时间点;

6、void signal(),唤醒一个等待条件的线程,本质是将等待条件线程移动到等待锁队列;
7、void signalAll(),唤醒所有等待条件的线程,本质是将所有等待条件线程移动到等待锁队列;


使用详解:

1、Condition接口主要是扩展了锁的等待条件,由等待指定时间扩展到等待指定条件;

2、ConditionObject类实现Condition接口,它是AbstractQueuedSynchronizer的内部类;

3、ConditionObject实例维护一个等待条件队列,await时将线程放入队列,signal时将线程从队列移除;

4、await和signal操作必须先持有锁,await操作会释放锁,signal操作将线程放到等待锁队列;


四、wait和notify

1、调用必须在synchronized同步代码里面,必须是同一个监视器,否则抛出异常IllegalMonitorStateException;

2、wait操作会释放锁,并且只有可以被中断的版本;

3、wait想要收到notify消息,则notify必须后于wait调用;

发表评论
评论通过审核之后才会显示。