日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Kotlin实战指南十六:Synchronized、Volatile

發(fā)布時(shí)間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kotlin实战指南十六:Synchronized、Volatile 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(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)單寫(xiě)法:

Kotlin中可以使用thread()方法創(chuàng)建新的線程,指定的語(yǔ)句塊將在新線程中運(yùn)行。語(yǔ)法簡(jiǎn)單,十分易用。

fun main() {thread {Log.d("yanjun", "開(kāi)啟一個(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)然也可以通過(guò) name 字段指定線程的名字:

fun main() {//指定線程的名字,是否自動(dòng)執(zhí)行thread(start = true, name = "my_thread") {} }

如何使用 Synchronized 同步鎖

在Java中,給一個(gè)方法加鎖 ,需要給方法加 synchronized 關(guān)鍵字

public synchronized void run() {}

kotlin 中沒(méi)有 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中沒(méi)有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ù)中沒(méi)有對(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)闆](méi)有無(wú)參構(gòu)造函數(shù)

如何才能調(diào)用無(wú)參構(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)生成 無(wú)參構(gòu)造函數(shù)

重載函數(shù) @JvmOverloads

class A(val name: String, val age: Int)var a1 = A("zhaoyanjun",10) //編譯正常 var a2 = A("123") //編譯失敗,沒(méi)有只有一個(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)鍵字
class A @JvmOverloads constructor(val name: String? = "", val age: Int? = 0)

總結(jié)

以上是生活随笔為你收集整理的Kotlin实战指南十六:Synchronized、Volatile的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。