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