日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Kotlin实战指南十六:Synchronized、Volatile

發布時間:2024/9/30 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 關鍵字
class A @JvmOverloads constructor(val name: String? = "", val age: Int? = 0)

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。