并发编程中级三:Java 锁框架[LockSupport]

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 
LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。
因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。
LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。

函数列表:

// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。 
static Object getBlocker(Thread t) 
// 为了线程调度,禁用当前线程,除非许可可用。 
static void park() 
// 为了线程调度,在许可可用之前禁用当前线程。 
static void park(Object blocker) 
// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。 
static void parkNanos(long nanos) 
// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。 
static void parkNanos(Object blocker, long nanos) 
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。 
static void parkUntil(long deadline) 
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。 
static void parkUntil(Object blocker, long deadline) 
// 如果给定线程的许可尚不可用,则使其可用。 
static void unpark(Thread thread) 
LockSupportTest:
package org.credo.jdk.thread.locksupport;

import java.util.concurrent.locks.LockSupport;

public class LockSupportTestB
{
	private static Thread mainThread;

	public static void main(String[] args)
	{
		LockSupportTestBTest test = new LockSupportTestBTest("current");
		mainThread = Thread.currentThread();
		System.out.println(Thread.currentThread().getName() + " start ta");
		test.start();
		System.out.println(Thread.currentThread().getName() + " block");
		LockSupport.park(mainThread);
		System.out.println(Thread.currentThread().getName() + " continue");
	}

	static class LockSupportTestBTest extends Thread
	{
		public LockSupportTestBTest(String name)
		{
			super(name);
		}

		@Override
		public void run()
		{
			System.out.println(Thread.currentThread().getName() + " wakup others");
			// 唤醒“主线程”
			LockSupport.unpark(mainThread);
		}
	}

}
结果:

main start ta
main block
current wakup others
main continue

说明 :park和wait的区别。wait让线程阻塞前,必须通过synchronized获取同步锁。


转:http://www.cnblogs.com/skywang12345/p/3505784.html

你可能感兴趣的:(并发编程中级三:Java 锁框架[LockSupport])