Android 面试札记第 5 篇

本文深入探讨Java中的volatile关键字,解析其对线程可见性和指令重排序的影响,同时介绍了DCL双检查锁机制实现线程安全的单例模式。此外,还对比了Synchronized和ReentrantLock的区别,以及公平锁和非公平锁的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile 关键字

Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。

当一个变量定义为 volatile 之后,将具备两种特性:

1.保证此变量对所有的线程的可见性,这里的“可见性”,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存拷贝到 CPU 缓存中来完成。

2.禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

volatile 性能:

volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。

参考 Java并发编程: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)

随时回收,用途不明。
回收条件:无条件,随时回收。

强,弱,软,虚引用回收时机

Java:强引用,软引用,弱引用和虚引用

List 元素删除一个对象方式

如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,
因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用

正确移除List中对象

如何从List集合中删除对象

service 有哪些启动方式,区别是什么

https://www.jianshu.com/p/4c798c91a613

IntentService

IntentService和Service区别

Android 消息机制

https://blog.csdn.net/haoxuhong/article/details/80103030

sendMessage 和 sendMessageDelay ,后者是如何实现 delay 的

Android 消息处理机制之三: Handler 中 sendMessage() 源代码剖析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值