其他分享
首页 > 其他分享> > LockSupport和Unsafe

LockSupport和Unsafe

作者:互联网

LockSupport

LockSupport 的主要功能是提供线程一个"许可", 通过这个"许可"来控制线程的阻塞和恢复; 

 

 

底层也是依赖于unsafe实现的 

 

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都有一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到permit变为1), 这时调用unpark会把permit置为1。每个线程都有一个相关的permit, permit最多只有一个,重复调用unpark也不会积累。

unpark函数 可以先于 park 调用。比如线程B 调用 unpark函数,给线程A 发了一个“许可”,那么当线程A 调用 park 时,它发现已经有“许可”了,那么它会马上再继续运行。

 

LockSupport就是通过控制变量 _counter来对线程阻塞唤醒进行控制的。原理有点类似于信号量机制。

LockSupport.park() 和 unpark() 和 object.wait() 和 notify() 很相似,那么它们有什么区别呢?
  1. 面向的主体不一样。LockSuport 主要是针对 Thread 进行阻塞处理,可以指定阻塞队列的目标对象,每次可以指定具体的线程唤醒。Object.wait() 是以对象为纬度,阻塞当前的线程和唤醒单个或所有线程。
  2. 实现机制不同。两者的阻塞队列并不交叉。也就是说 unpark不会对 wait起作用,notify也不会对 park起作用。object.notifyAll() 不能唤醒 LockSupport 的阻塞 Thread。
  3. wait和notify必须配合sychonozed关键字同时使用,不然会抛出异常,造成程序卡死的状态;
  LockSupport 是 JDK 中用来实现线程阻塞和唤醒的工具。使用它可以在任何场合使线程阻塞,可以指定任何线程进行唤醒,并且不用担心阻塞和唤醒操作的顺序,但要注意连续多次唤醒的效果和一次唤醒是一样的。

 

Unsafe

java concurrent 包的基础是CAS, 而进行CAS操作的就是这个 Unsafe类.

Unsafe 类是Java中的保护类, 在外面包中使用通常通过反射获取 Unsafe类实例

unsafe类是沟通java代码和计算机底层的一把神奇的钥匙 , 而在实际的通常用于原子性的改变对象中的某个变量

 

 

 

标签:调用,Unsafe,park,LockSupport,阻塞,unpark,线程
来源: https://www.cnblogs.com/Paytons/p/16466881.html