java
文章平均质量分 70
查尔斯欢
这个作者很懒,什么都没留下…
展开
-
内存屏障与volatile
内存屏障由于现代操作系统都是多处理器操作系统,每个处理器都会有自己的缓存,可能存再不同处理器缓存不一致的问题,而且由于操作系统可能存在重排序,导致读取到错误的数据,因此,操作系统提供了一些内存屏障以解决这种问题:LoadLoad屏障对于Load1; LoadLoad; Load2 ,操作系统保证在Load2及后续的读操作读取之前,Load1已经读取。StoreStore屏障对于Store1;原创 2018-01-03 20:11:46 · 3822 阅读 · 1 评论 -
AtomicInteger源码解析
AtomicInteger源码非常简单,仅仅使用了一个volatile类型的值和一个static类型的偏移量完成整个原子int操作。其中,valueoffset用来记录value字段相对于整个类对象起始位置的偏移量,这个在class被加载到内存的时候就已经确定了,因此使用static类型的值,final保证了数据的可见性。value使用volatile,通过volatile内存屏障保证value类型原创 2018-01-03 22:27:36 · 290 阅读 · 0 评论 -
java类文件格式和类加载机制
Class文件解析java虚拟机设计之初,就考虑到语言扩展的问题,因此java虚拟机并不是专门为java服务的。确切的说,java虚拟机是为class文件服务的,一切合法的class文件都可以被虚拟机接受执行,而java编译器将java代码编译成对应的class文件,从而被虚拟机执行。类似的,如今groovy和scala文件都可以被各自的编译器编译成class文件运行在java虚拟机中。为了保证cl原创 2018-01-06 16:00:23 · 1040 阅读 · 0 评论 -
HashMap死循环问题追踪
HashMap死循环问题追踪简介HashMap在设计之初并没有考虑多线程并发的情况,多线程并发的情况下理论上应该使用ConcurrentHashMap,但是程序中经常会无意中在多并发的情况下使用了HashMap,如果是jdk1.8以下的版本,有可能会导致死循环,打满cpu占用,下面基于jdk1.7源码分析下原因。HashMap的原理我们从put看起 public V put(K key, V原创 2018-02-26 14:17:17 · 348 阅读 · 0 评论 -
ClassLoader和热加载
classloader 任何一本java相关的书都有介绍classloader相关的知识,最近工作中确实用到了一些classloader相关的东西,做个总结以免自己忘记。定义classloader负责将应用中用到的==所有class==加载到虚拟机中供应用使用,并且确保类能够被==正确的以符合开发者想法的方式加载,保证所有类能够被正确的使用==。这里对应的是类加载的第一阶段。...原创 2018-03-12 21:06:10 · 439 阅读 · 0 评论 -
虚引用实现资源回收
资源回收GC是Java平台的一个重要特性,大大减轻了开发人员对内存管理的痛苦,帮助他们不受内存相关的问题影响。然而,当在java代码中使用了外部资源(例如文件和套接字),内存管理将变得棘手,因为单独的GC不足以管理这样的资源。问题假设我们有如下场景,我们需要在Resource实例被销毁前,调用到dispose()方法:public interface ResourceFacade { ...原创 2019-01-06 17:24:00 · 724 阅读 · 1 评论