- 浏览: 5337 次
- 性别:
- 来自: 北京
文章分类
最新评论
AtomicBoolean源码分析
Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:
1、通过Unsafe类可以分配内存,可以释放内存;
2、可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;
3、挂起与恢复
4、CAS操作:是通过compareAndSwapXXX方法实现的
详细内容请参考http://www.cnblogs.com/mickole/articles/3757278.html
unsafe.objectFieldOffset(AtomicBoolean.class.getDeclaredField("value"));
objectFieldOffset()方法用于获取某个字段相对Java对象的“起始地址”的偏移量
一个java对象可以看成是一段内存,各个字段都得按照一定的顺序放在这段内存里,同时考虑到对齐要求,可能这些字段不是连续放置的,用这个方法能准确地告诉你某个字段相对于对象的起始内存地址的字节偏移量,因为是相对偏移量,所以它其实跟某个具体对象又没什么太大关系,跟class的定义和虚拟机的内存模型的实现细节更相关。
unsafe.compareAndSwapInt比较obj的offset处内存位置中的值和期望的值,如果相同则更新。此更新是不可中断的
compareAndSet、weakCompareAndSet、getAndSet都是通过unsafe.compareAndSwapInt的方法来实现业务逻辑的!
lazySet方法 通过 unsafe.putOrderedInt(this, valueOffset, v) 方法实现
设置obj对象中offset偏移地址对应的整型field的值为指定值。这是一个有序或者有延迟的方法,并且不保证值的改变被其他线程立即看到。只有在field被修饰并且期望被意外修改的时候使用才有用。
AtomicInteger 源码分析
AtomicInteger 图上这些方法和AtomicBoolean的套路一样,主要不同的是下面这些方法:
AtomicInteger 的 getAndIncrement、getAndDecrement、getAndAdd、incrementAndGet、decrementAndGet、addAndGet 都是使用unsafe.getAndAddInt方法直接操作底层内存偏移地址对应的整型数值进行加减操作!
getAndAccumulate、accumulateAndGet、updateAndGet方法都是通过输入IntUnaryOperator接口类型的参数来实现逻辑的!这个类型是Java 8中新增加了一个包 java.util.function,带来了常用的 Lambda 表达式函数式接口,也就是箭头函数。这些方法都是jdk1.8以后开始提供的!
jdk1.8之后提供的方法:
getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)自动更新当前值与给定的功能应用到当前和给定值的结果,返回前一个值。
accumulateAndGet(int x, IntBinaryOperator accumulatorFunction) 自动更新当前值与给定的功能应用到当前和给定值的结果,返回更新后的值。
updateAndGet(IntUnaryOperator updateFunction) 自动更新当前值与结果应用给定的函数,返回更新后的值。
Interface IntUnaryOperator
这是一个功能接口,因此可以作为赋值的目标一个lambda表达式或方法参考。
代表在一个单一的 int-valued操作数,产生一个 int-valued结果操作。这是 int的 UnaryOperator原始类型的专业化。
这是一个functional interface其功能的方法是applyAsInt(int)。
AtomicLong 和AtomicInteger所提供的方法差不多,大部分都是把方法返回的类型改成了Long,但是源码有一处代码引起了我的注意:
AtomicReference<V> 也不多说了 这四个基本类型懂一个另外三个也就明白了!
发表评论
-
Netty学习
2018-01-16 13:22 011111 -
java性能优化
2017-08-07 22:08 01111111 -
设计模式(四)
2017-07-30 18:30 37613.访问者模式 访问者模式也称为Visitor模式,使用这种 ... -
java多线程模式(二)
2017-07-18 22:05 01.Thread Specific Storage (线 ... -
java多线程模式(一)
2017-07-18 22:00 3501.Immutable Object (不可变对象) 模式 ... -
java多线程(十)
2017-07-13 23:14 0多线程分析监控调优工具 -
java多线程(八)
2017-07-13 22:54 41514、对象锁 1. 对象锁 所有对象都自动含有单 ... -
java多线程(七)
2017-07-12 23:54 417目前在Java中存在两种锁 ... -
java多线程(六)
2017-07-11 23:32 3739、悲观锁 悲 ... -
java多线程(五)
2017-07-09 20:25 4845、读写锁 相比Java中的 ... -
java多线程(四)
2017-07-09 16:13 412锁 java 多线程的锁我是 ... -
java多线程(三)
2017-07-08 23:30 323线程状态转化图 这 ... -
java多线程(二)
2017-07-03 23:18 467上节说到final、volatile、synchronized ... -
java多线程(一)
2017-07-03 23:17 381很多人都对其中的一些 ...
相关推荐
java源码学习比较java源码学习比较
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
学习调试java源码学习调试java源码
Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)Java学习笔记(源码)
Notebook源码,Java记事本.Java源码学习
1 编制如记事本的文本编辑器程序。 2 设置具有简单计算功能的计算器applet程序。 都是从DOS里运行出来的
Java源码包100个设计实例, 大量 实例,可以作为你的学习设计参考。 实例如下: Applet钢琴模拟程序java源码 Calendar万年历 copass源代码.rar DataBuffer在Java中使用ADO.NET.rar EJB 模拟银行ATM流程及操作源代码 ...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
【新技术】java框架源码springmvc+mybatis分享源码学习a
2015年我报了一个培训机构,学习这里开发技术,我花了一万多块的学费,正在学习中,如今把Java课程阶段的课程是结束了,把资料整理了一下,然后上传上来了,大家共享一下,所有所学的Java阶段代码还有注释们都是,所...
jsp生产管理系统.java源码学习
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
jsp高校科研项目管理系统java源码学习
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
msn聊天程序Java仿真代码.java源码学习
包括Java基础、IO、集合使用、数据库、socket编程、多线程编程等,很适合有一定编程基础的学习者使用
P2P源码 Azureus 2.5.0.2(JAVA).Java源码学习
零基础学习JAVA源码