LockSupport详解 ReentrantLock详解 Condition详解 wait和notify
- 2017-02-28 22:01:00
- admin
- 原创 1562
一、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调用;