1.混淆做了哪些事情?
- 压缩:从应用及依赖库中删除没有使用的类、方法、字段,有助于规避64位方法数的限制
- 优化:通过代码分析移除没有使用的代码,甚至重写代码
- 混淆:使用没有意义的简短名称,重命名类、方法、字段,增加逆向难度。
- 预校验:对于面向java6和java7 jvm的class文件,编译时可以把预校验信息添加到类文件中,从而加快运行时类加载效率,但是对于Android平台无效。
2.double check的单例为什么要用volatile修饰?
答:对象的创建可简化为以下三个步骤:
- jvm分配内存空间
- 对象初始化
- 引用指向内存地址
主要是为了类加载时虚拟机对对象创建步骤进行重排,先执行了第三步,然后再执行第二步。多线程时,一个线程先执行引用指向内存地址,这个时候另一个线程中获取到的引用因为已经指向了内存地址,所以不为空,但是对象并没有初始化完成,所以使用时会出现异常。使用volatile可以防止对象创建执行顺序的重排,避免出现异常。
网友评论