转载请标明出处: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相关推荐

  1. Kotlin实战指南十九:use 函数魔法

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117366756 本文出自[赵彦军的博客] 文章目录 往期精彩文章 use函数 往期 ...

  2. Kotlin实战指南十八:open、internal 关键字使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712 本文出自[赵彦军的博客] 文章目录 往期精彩文章 open关键字 ...

  3. Kotlin实战指南十:let、apply、with、run

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details//94402604 本文出自[赵彦军的博客] 文章目录 let 示例1:基础用法 示 ...

  4. Kotlin实战指南十四:协程启动模式

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...

  5. Kotlin实战指南十二:data class

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/94649274 本文出自[赵彦军的博客] 文章目录 前言 正文 toString( ...

  6. Kotlin实战指南十五:协程泄漏

    转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/106413283 本文出自[赵彦军的博客] 文章目录 协程泄漏的本质 Global ...

  7. Kotlin实战指南十七:JvmField、JvmStatic使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666 本文出自[赵彦军的博客] 文章目录 往期精彩文章 @JvmFiel ...

  8. Kotlin实战指南二十:flow

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117370700 本文出自[赵彦军的博客] 文章目录 往期精彩文章 flow 是啥 ...

  9. Vue实战篇十六:导航菜单

    系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...

最新文章

  1. 关于appcan自动升级功能
  2. Kotlin教程(九)泛型
  3. SDUT 贪心算法 删数问题
  4. mysql 5.6升级8.0_Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法...
  5. UE4学习-UE4结合vs2019混合编程
  6. CentOS 5.5 Freeradius MySQL
  7. 每天练习50个shell
  8. linux shell加密压缩,linux的shell指令进行压缩或者解压缩
  9. 36数字在排序数组中出现的次数
  10. html使用自我知识点总结
  11. Jenkins打卡Day19-Jenkins重启关闭服务
  12. hdoj4540:威威猫系列故事——打地鼠(dp基础题-数塔思想)
  13. 数学建模方法之目标规划
  14. python处理Excel数据串行串列问题
  15. 用计算机打出5201 314文字,怎么识别书上或照片中的文字并保存为电子版?
  16. java mediatype属性_Java MediaType.MULTIPART_FORM_DATA_TYPE属性代码示例
  17. 淘宝关键词API接口
  18. angularjs2大漠穷秋视频笔记整理
  19. linux使用windows无线网卡,linux下安装windows xp无线网卡驱动
  20. nginx简介及作用

热门文章

  1. matlab radn,如何用matlab编写randn函数?
  2. 三、ResNet50预置算法提高美食分类识别精确度
  3. 四十一、完成scrapy爬取官方网站新房的数据
  4. 工程制图 (立体投影)
  5. sklearn模型的训练(上)
  6. AAAI 2022 | 条件局部图卷积网络用以气象预测
  7. 来试试读论文的新神器!AMiner发布“论文背景文献”一键生成工具,帮你搞清一篇论文的“来龙去脉”...
  8. 知识库问答中的关系识别研究回顾
  9. 再谈类别不平衡问题:调节权重与魔改Loss的综合分析
  10. ACL 2020 | 知识库问答的多跳复杂问题查询图生成