码迷,mamicode.com
首页 > 其他好文 > 详细

jdk源码之LockSupport

时间:2018-07-10 11:33:12      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:分配   http   构造方法   wait   netty   对象   操作   开发   swap   

 

前言/背景

在前面说到了UnSafe类,它给我提供了一个“后门”,让我们可以直接操作内存,挂起线程等操作。这一讲我们来看看LockSupport,顾名思义,它是给我们后面的LockSupport提供支持的。

概述

在我们过去的学习的,说起线程的挂起与恢复,我们就会想到wait与notify。在LockSupport中提供了另一个挂起(park)与恢复unpark线程的方式。两者的区别如下

  • 语义上更符合。wait需要在sychronized代码中才能调用,首先要获得对象的监视锁,即面向对象操作的挂起与恢复;而park是面向线程操作的挂起与恢复。
  • 使用上更灵活。wait操作我们需要先获取对象的监视锁;而park不需要,可以随意进行park与unpark,unpark可以先于park调用。
  • interupt中断不同。wait时如果收到中断会抛出中断异常,我们可以在catch处理;park的话,我们可以通过interrupted或isInterrupted去判断线程是否中断。

 

源码/知识点

  • 内存分配:
    • 分配内存,重新分配内存,拷贝内存,释放内存
    • 获取内存地址,获取内存地址指向的整数,将整数写向指定的内存地址
  • 非常规实例化:不需要调用构造方法
  • 直接操作数组、普通对象、变量:可以通过指针、偏移量直接操作对象、变量
  • 多线程同步
    • monitorEnter、tryMonitorEnter、monitorExit
    • compareAndSwapObject、compareAndSwapInt、compareAndSwapLong
  • 线程的挂起和恢复:park与unpack方法
  • 内存屏障:用于避免指令重排序

总结

在我们的开发中不会直接使用到这个类,但在AQS、并发原子类,以及netty,kafaka底层实现中,都有这个类,所以了解学习这个开“后门”的类还是很有必要的。

参考链接

  • https://blog.csdn.net/opensure/article/details/53349698

 

jdk源码之LockSupport

标签:分配   http   构造方法   wait   netty   对象   操作   开发   swap   

原文地址:https://www.cnblogs.com/lucas2/p/9287052.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!