volatile 关键字
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。
当一个变量定义为 volatile 之后,将具备两种特性:
1.保证此变量对所有的线程的可见性,这里的“可见性”,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存拷贝到 CPU 缓存中来完成。
2.禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。
volatile 性能:
volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
线程安全的单例模式
主要承接上一题目,考察 volatile 和 synchronizede 关键字。
为了达到线程安全,又能提高代码执行效率,我们这里可以采用 DCL(Double Check Locking 双检查锁机制)的双检查锁机制来完成,代码实现如下:
public class MySingleton {
//使用volatile关键字保其可见性
volatile private static MySingleton instance = null;
// 私有化构造方法,外部无法直接实例化该对象
private MySingleton(){}
public static MySingleton getInstance() {
if(instance == null){
synchronized (MySingleton.class) {
if(instance == null){//二次检查
instance = new MySingleton();
}
}
}
return instance;
}
}
参考 https://blog.csdn.net/cselmu9/article/details/51366946
求二叉树的最大深度
Synchronized 和 ReentantLock
https://blog.csdn.net/zxd8080666/article/details/83214089
公平锁和非公平锁等
公平锁:线程获取锁的顺序和调用lock的顺序一样,FIFO;
非公平锁:线程获取锁的顺序和调用lock的顺序无关,全凭运气。
https://www.jianshu.com/p/d86faec4baa1
弱引用和软引用,以及各自的回收时机
强引用
正常定义的对象引用。
回收条件:不在引用
弱引用(WeakReference)
可用来解决asynctask 内存泄漏的问题。在切换其他acitivty的时候,如果这个actiity已经destory了,就应该让它回收。此时如果我们用弱引用的话,就能防止不能被回收。
回收条件:一般在弱引用的同时,这个对象可能也被强引用了。如果这个强引用消失了,系统就开始回收弱引用。
软引用(SoftReference)
在内存紧张的时候,能为其他对象释放内存。
回收条件: 内存不够的时候回收
虚引用(PhantomReference)
随时回收,用途不明。
回收条件:无条件,随时回收。
List 元素删除一个对象方式
如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,
因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用
service 有哪些启动方式,区别是什么
https://www.jianshu.com/p/4c798c91a613
IntentService
Android 消息机制
https://blog.csdn.net/haoxuhong/article/details/80103030