Kotlin实战指南十六:Synchronized、Volatile
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/116267707
本文出自【趙彥軍的博客】
文章目錄
- 如何創建線程 Thread
- 如何使用 Synchronized 同步鎖
- 例子1
- 例子2
- Volatile 關鍵字
- 默認賦值
- 默認不為空
- 可以為空
- 默認值
- 兩個默認值
- 構造函數
- 重載函數 `@JvmOverloads `
如何創建線程 Thread
在Kotlin 中,我們仍然可以使用 java 的語法創建一個線程
Thread(Runnable { }).start()//或者使用 Lambda 表達式 Thread {}.start()事實上,kotlin 為我們提供了一個簡單寫法:
Kotlin中可以使用thread()方法創建新的線程,指定的語句塊將在新線程中運行。語法簡單,十分易用。
fun main() {thread {Log.d("yanjun", "開啟一個線程")} }用法夠簡單吧。你會好奇thread {}到底是什么黑科技,其實很簡單,語法糖而已。 其實是一個 thread() {} 函數
public fun thread(start: Boolean = true,isDaemon: Boolean = false,contextClassLoader: ClassLoader? = null,name: String? = null,priority: Int = -1,block: () -> Unit ): Thread {val thread = object : Thread() {public override fun run() {block()}}if (isDaemon)thread.isDaemon = trueif (priority > 0)thread.priority = priorityif (name != null)thread.name = nameif (contextClassLoader != null)thread.contextClassLoader = contextClassLoaderif (start)thread.start()return thread }可以看到 start 參數默認為 true ,自動執行線程。當然也可以通過 name 字段指定線程的名字:
fun main() {//指定線程的名字,是否自動執行thread(start = true, name = "my_thread") {} }如何使用 Synchronized 同步鎖
在Java中,給一個方法加鎖 ,需要給方法加 synchronized 關鍵字
public synchronized void run() {}kotlin 中沒有 synchronized 關鍵之,取而代之的是 @Synchronized 注解
class Util {@Synchronizedfun main() {} }我們把 kotlin 代碼反編譯一下看看,
可以看到 @Synchronized 注解 可以達到 Java synchronized 關鍵字的作用。
除此之外,kotlin 在方法內,可以使用 block 塊
例子1
class Util {val lock = Any()fun main() {synchronized(this) {}} }編譯成 java 如下
例子2
class Util {val lock = Any()fun main() {synchronized(lock) {}} }編譯成 java 如下
Volatile 關鍵字
在kotlin中沒有volatile關鍵字,但是有 @Volatile 注解
class Util {@Volatilevar lock = Any() }編譯成 java 如下
默認賦值
默認不為空
class A(val name: String, val age: Int)代表 name、age 不能為 null , 轉換成 java , 會看到在構造函數中會對 name 字段做 空校驗。
可以為空
class A(val name: String?, val age: Int)代表 name 可為 null , 轉換成 java , 會看到在構造函數中沒有對 name 字段做 空校驗。
默認值
class A(val name: String? = "zhaoyanjun", val age: Int)name 可為空,如果name 為null, 使用默認值 “zhaoyanjun”
兩個默認值
class A(val name: String? = "zhaoyanjun", val age: Int ?= 10)構造函數
class A(val name: String, val age: Int)var a1 = A("zhaoyanjun",10) //編譯正常 var a = A() //編譯失敗,因為沒有無參構造函數如何才能調用無參構造函數呢?其實很簡單,給每個參數添加一個默認值就可以了
class A(val name: String? = "", val age: Int? = 0)只要參數都有默認值,就會默認生成 無參構造函數
重載函數 @JvmOverloads
class A(val name: String, val age: Int)var a1 = A("zhaoyanjun",10) //編譯正常 var a2 = A("123") //編譯失敗,沒有只有一個參數的構造函數如何才能自動生成重載函數呢?其實很簡單
- 給每個參數添加默認值
- 標記 constructor 關鍵字
- 標記 @JvmOverloads 關鍵字
總結
以上是生活随笔為你收集整理的Kotlin实战指南十六:Synchronized、Volatile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Androidx ViewPager+F
- 下一篇: Kotlin实战指南十七:JvmFiel