摘要:
两段代码 上面两段代码都表示了+1,但是在多线程下Atomic中不需要synchronized,因为Atomic是原子性操作。而++则不行 下面我们来看AtomicInteger源码分析: AtomicInteger用的是sun.misc.Unsafe调用本地方法。 value值用的是volatil 阅读全文
摘要:
Java中大部分错误都是基于内存管理方面的。如果想破坏,可以使用Unsafe这个类。 实例化Unsafe: 下面两种方式是不行的 所以,简单方式就是通过反射去实例化Unsafe 避免初始化 当你想要跳过对象初始化阶段,或绕过构造器的安全检查,或实例化一个没有任何公共构造器的类,allocateIns 阅读全文
摘要:
CAS中有三个参数:内存值V、旧值A、预期值B 以AtomicInteger为例 Unsafe是CAS的核心类,Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开启了一个后门,Unsafe 它提供了硬件级别的原子操作。 valueOffset为变量值 阅读全文
摘要:
Java 中有四种引用:强引用、软引用、弱引用、虚引用; 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用。如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止 阅读全文
摘要:
一.如何确定某个对象是“垃圾”? 二.典型的垃圾收集算法 三.典型的垃圾收集器 一.如何确定某个对象是“垃圾”? 在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行,那么显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。如果一个对象没有任何引用与之相关 阅读全文
摘要:
今天遇到个问题 找不到类,最后发现 Class.forName中要完整的类名 阅读全文
摘要:
定义:一个软件实体。如类/模块/函都应该对扩展开放,对修改关闭。 问题由来:在软件的生命周期内,因为变化,升级和维护等原因需要对软件原有代码进行修改,可能会给旧代码引入错误,也有可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。 解决方案:当软件需要变化时,尽量通过扩展软件实体的行 阅读全文
摘要:
定义:一个类和另一个类应该保持最小的了解 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类影响也越大。 解决方案:尽量降低类与类之间的耦合。 迪米特法则的初衷是降低类的耦合,由于每个类都减少了不必要的依赖,因此确实可以降低耦合关系。但凡事有个度,虽然可以避免与非直接的类通 阅读全文
摘要:
定义:客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上 问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须实现他们不需要的办法。 解决方案:将接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依 阅读全文