LockSupport
LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能
jdk1.6新增的方法,由于jdk1.5之前当线程阻塞(使用synchronized关键字)在一个对象上的时候,通过线程dunp能查看到该线程的阻塞对象,方便定位问题。jdk1.5出现的Lock等并发工具缺遗漏了这一点,致使在线程dump时无法提供阻塞对象的信息。因此jdk1.6中LockSupport新增了三个含有阻塞对象的park方法,用于替代原来的park方法。
Lock锁在jconsole中查看的线程信息

sychronized锁在jconsole中查看的线程信息

park
//jdk1.6新增的
//用于实现阻塞当前线程的作用,参数blocker是用来表示当前线程在等待的对象(阻塞对象),主要用于问题排查和系统监控
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, 0L);
setBlocker(t, null);
}
//阻塞当前线程,最长不超过nanos纳秒,返回条件在park()的基础上增加了超时返回
public static void parkNanos(long nanos) {
if (nanos > 0)
UNSAFE.park(false, nanos);
}
//阻塞当前线程,阻塞对象为blocker,最长不超过nanos纳秒
public static void parkNanos(Object blocker, long nanos) {
if (nanos > 0) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(false, nanos);
setBlocker(t, null);
}
}
//阻塞当前线程,直到deadline时间(从1970年开始到deadline时间的毫秒数)
public static void parkUntil(long deadline) {
UNSAFE.park(true, deadline);
}
//阻塞当前线程,阻塞对象对blocker,直到deadline
public static void parkUntil(Object blocker, long deadline) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
UNSAFE.park(true, deadline);
setBlocker(t, null);
}
unpark
//唤醒处于阻塞状态的线程thread
public static void unpark(Thread thread) {
if (thread != null)
UNSAFE.unpark(thread);
}
本文介绍了Java 1.6中新增的LockSupport类,该类提供了一系列静态方法,用于实现线程的阻塞和唤醒操作。文章详细解释了park和unpark方法的用法,并对比了与synchronized关键字的不同。
1151

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



