ps:聽了某個LOL王者五大神的建議,取了這個名字
簡介:
本文主要記錄從java轉kotlin時遇到的問題,非學習使用。不過結尾會提供兩個pdf版學習書籍給大家。好了,下面開始正文。
正文:
1. kotlin中的空判斷(?)是怎麼實現的?,是否線程安全?
答:這個空判斷應該相當於java中的三目運算符(a == b ? a:b),但java中的三目元算符是非線程安全的(不符合原子性),在kotlin中是怎麼實現的呢,這個需要查看class文件:
首先上一段java代碼:
public class Test {
private final Object obj = null;
public void main() {
String a = obj == null ? "" : obj.toString();
}
}
相應的class指令:
Code:
stack=1, locals=2, args_size=1
0: aload_0
1: getfield #2 // Field obj:Ljava/lang/Object;
4: ifnonnull 12
7: ldc #3 // String
9: goto 19
12: aload_0
13: getfield #2 // Field obj:Ljava/lang/Object;
16: invokevirtual #4 // Method java/lang/Object.toStrin
)Ljava/lang/String;
19: astore_1
20: return
kotlin代碼:
class Test {
private var obj: Any? = null
fun main() {
val a = obj?.toString()
}
}
對應的class文件:
Code:
stack=2, locals=2, args_size=1
0: aload_0
1: getfield #10 // Field obj:Ljava/lang/Object;
4: dup
5: ifnull 14
8: invokevirtual #14 // Method java/lang/Object.toStrin
:()Ljava/lang/String;
11: goto 16
14: pop
15: aconst_null
16: astore_1
17: return
對比發現kotlin的class文件 比 java的class文件 多了一個dup指令。
dup:複製棧頂的一個值,並將複製值重新壓入棧頂
所以kotlin的空判斷無關線程安全,只是可以保證不會報錯。其結果是不可確定的。
附件書籍: