2020 Android 面試總結 - 02

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() 源代碼剖析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章