您的位置:首页 > 编程语言 > Java开发

java 中锁实现

2016-05-17 17:42 447 查看

一、 Synchronized的实现

synchronized关键字是利用的系统的锁机制实现的。

二、 java.util.concurrent.locks.LockSupport

java1.5开始提供了lock锁机制,使得线程锁使用更加方便。lock锁机制底层调用的就是LockSupport这个类,其底层也是调用了操作系统提供的lock方法。

关于LockSupport的讲解请看这里

文章中主要讲解了LockSupport的几个lock方法和unlock方法和阻塞时阻塞对象的设置与获得。这些方法其实底层调用的是sun.misc.Unsafe类的lock和unlock方法,sun.misc.Unsafe类的方法实际上是调用的操作系统的native方法的。所以JAVA是平台独立的说法是指jvm虚拟机为我们屏蔽了平台相关的方法,同时java把一些平台相关的方法包装起来,只是让java底层调用,而不给用户使用。

要注意的一点就是,sun.misc.Unsafe底层的lock和unlock方法的作用:

unsafe.park(boolean absolute, long deadline);unsafe.unpark(Thread thread);

park:阻塞当前线程,(1)当配对的unpark发生或者(2)配对的unpark已经发生或者线程被中断时恢复(unpark先行,再执行park)。 (3)当absolute是false时,如果给定的时间是非0(负数)或者给定的时间(正数, 时间单位时毫秒)已经过去了(0的时候会一直阻塞着)。(4)当Absolute是true时,如果给定的时间(时间单位是纳秒)过去了或者伪造的(在我理解是参数不合法时)线程会恢复中断。这个操作是不安全的,所以在其他调用会很奇怪(奇怪?反正就是用的时候要小心)

unpark:当指定线程被park命令阻塞时unpark命令可以恢复阻塞。在park命令没有被先调用过的时候,调用unpark,线程仍然不被阻塞。

LockSupport的使用方式一般是看这里

public static void main(String[] args)
{
Thread thread = Thread.currentThread();
LockSupport.unpark(thread);//释放许可
LockSupport.park();// 获取许可
System.out.println("b");
}


关键点是:LockSupport默认是被占用的,需要先unpark;LockSupport是不可重入的;LockSupport的park方法被interrupt以后是不会抛出InterruptedException的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: