`

java源码学习(一)

阅读更多

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> 也不多说了 这四个基本类型懂一个另外三个也就明白了!


  • 大小: 51.1 KB
  • 大小: 40.6 KB
  • 大小: 46 KB
  • 大小: 20.5 KB
  • 大小: 8.4 KB
  • 大小: 18.5 KB
  • 大小: 48.8 KB
  • 大小: 43.4 KB
  • 大小: 42.7 KB
分享到:
评论

相关推荐

    java源码包---java 源码 大量 实例

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    java源码学习比较java源码学习比较

    总的来说,Java源码学习是一个不断探索和实践的过程。通过比较和学习各种源码,我们可以深化对Java的理解,提升编程技艺,为职业生涯打下坚实基础。在学习过程中,持续反思、提问和实践,将是推动进步的关键。

    java源码包2

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    Java源码大全

    综上所述,Java源码大全是一个全面的Java学习资源,无论你是初学者还是有经验的开发者,都能从中找到有价值的代码示例和学习素材。通过这个压缩包,你可以系统地学习Java语言,掌握各种编程技巧,以及提升算法设计和...

    Java源码包100个设计实例.zip

    Java源码包100个设计实例, 大量 实例,可以作为你的学习设计参考。 实例如下: Applet钢琴模拟程序java源码 Calendar万年历 copass源代码.rar DataBuffer在Java中使用ADO.NET.rar EJB 模拟银行ATM流程及操作源代码 ...

    麻将游戏Java源码

    【标题】"麻将游戏Java源码"所涉及的知识点主要集中在Java编程语言和...通过分析和学习这些Java源码,不仅可以提升Java编程技巧,还能深入理解游戏开发过程,对于想要从事游戏开发的程序员来说,是一份宝贵的教育资源。

    JAVA源码学习的基本

    本篇将基于"JAVA源码学习的基本"这一主题,探讨Java源码的重要性以及如何有效地进行源码学习。 首先,Java是一门面向对象的编程语言,它的设计思想、类库以及核心API都是通过源码实现的。学习源码,特别是像Java...

    java源码学习阶段所有的源码

    2015年我报了一个培训机构,学习这里开发技术,我花了一万多块的学费,正在学习中,如今把Java课程阶段的课程是结束了,把资料整理了一下,然后上传上来了,大家共享一下,所有所学的Java阶段代码还有注释们都是,所...

    140个java源码实例分享源码学习a(解压密码http://hao.360.cn/?src=lm&ls=n527fd66b97)

    这个名为"140个java源码实例分享源码学习a"的资源包,显然是为了帮助Java初学者和进阶者提升技能,通过实际的代码示例来理解和掌握Java编程的核心概念和技巧。 首先,我们看到有"下载及使用说明.txt",这通常包含的...

    java源码包3

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    140个Java源码实例

    《140个Java源码实例》是一份极具价值的学习资料,特别适合初学者作为入门级的重要参考资料。这个压缩包包含了一系列的Java编程实例,旨在帮助用户深入理解Java语言的核心概念和常用技术。通过实际操作这些源代码,...

    65个JAVA源码网站文档

    本文将深入探讨一个标题为“65个JAVA源码网站文档”的资源集合,它号称是最全面的Java源码网站文档汇编,旨在为用户提供丰富的源码下载渠道。 ### 一、理解“JAVA源码”与“源码网站文档” **JAVA源码**是指用Java...

    飞机大战java源码

    本篇将深入探讨"飞机大战"的Java源码,旨在为初学者提供一个良好的学习起点,同时也为有经验的开发者提供参考资料。 首先,我们要理解Java语言在游戏开发中的应用。Java以其跨平台的特性、丰富的类库和强大的性能,...

    140个java源码实例Java实用源码整理learns

    标题中的“140个Java源码实例Java实用源码整理learns”表明这是一个集合了140个Java编程的实战代码示例,旨在帮助学习者深入理解和掌握Java编程语言。这些实例通常涵盖了许多Java的基础和进阶概念,可能是从小到大的...

    最全的java源码库

    Java源码库是一个极其宝贵的资源,对于学习和深入理解Java编程语言至关重要。这个"最全的java源码库"包含了广泛且多样的Java项目、框架、库和工具的源代码,可以帮助开发者提升技能,理解复杂算法,研究设计模式,...

    深入学习java源码-java:深入java源码学习

    本资料集“深入学习java源码 - java:深入java源码学习”专注于探讨Java的核心特性,特别是针对面试中的深度问题进行解析。在这里,我们将深入探讨Java的基本数据类型以及它们的内存占用大小。 Java提供了九种基本...

    vnc_java源码

    10. **学习与调试**: 对于开发者来说,分析VNC Java源码可以帮助理解远程桌面协议的工作原理,同时也为定制化或优化VNC提供了可能。你可以通过阅读源码来了解每个组件的作用,甚至添加新的功能或修复已知问题。 ...

    Java2EE源码-Java源码

    Java2EE源码,包含java.interceptor、java.mail、java.annotation、java.jsm、java.transaction、java.xml,可供广大想学习java源码的朋友使用!

Global site tag (gtag.js) - Google Analytics