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相关推荐
- Kotlin实战指南十九:use 函数魔法
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117366756 本文出自[赵彦军的博客] 文章目录 往期精彩文章 use函数 往期 ...
- Kotlin实战指南十八:open、internal 关键字使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712 本文出自[赵彦军的博客] 文章目录 往期精彩文章 open关键字 ...
- Kotlin实战指南十:let、apply、with、run
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details//94402604 本文出自[赵彦军的博客] 文章目录 let 示例1:基础用法 示 ...
- Kotlin实战指南十四:协程启动模式
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/96008400 本文出自[赵彦军的博客] 文章目录 协程启动 DEFAULT LA ...
- Kotlin实战指南十二:data class
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/94649274 本文出自[赵彦军的博客] 文章目录 前言 正文 toString( ...
- Kotlin实战指南十五:协程泄漏
转载请标明出处:https://blog.csdn.net/zhaoyanjun6/article/details/106413283 本文出自[赵彦军的博客] 文章目录 协程泄漏的本质 Global ...
- Kotlin实战指南十七:JvmField、JvmStatic使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116668666 本文出自[赵彦军的博客] 文章目录 往期精彩文章 @JvmFiel ...
- Kotlin实战指南二十:flow
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117370700 本文出自[赵彦军的博客] 文章目录 往期精彩文章 flow 是啥 ...
- Vue实战篇十六:导航菜单
系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...
最新文章
- 关于appcan自动升级功能
- Kotlin教程(九)泛型
- SDUT 贪心算法 删数问题
- mysql 5.6升级8.0_Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法...
- UE4学习-UE4结合vs2019混合编程
- CentOS 5.5 Freeradius MySQL
- 每天练习50个shell
- linux shell加密压缩,linux的shell指令进行压缩或者解压缩
- 36数字在排序数组中出现的次数
- html使用自我知识点总结
- Jenkins打卡Day19-Jenkins重启关闭服务
- hdoj4540:威威猫系列故事——打地鼠(dp基础题-数塔思想)
- 数学建模方法之目标规划
- python处理Excel数据串行串列问题
- 用计算机打出5201 314文字,怎么识别书上或照片中的文字并保存为电子版?
- java mediatype属性_Java MediaType.MULTIPART_FORM_DATA_TYPE属性代码示例
- 淘宝关键词API接口
- angularjs2大漠穷秋视频笔记整理
- linux使用windows无线网卡,linux下安装windows xp无线网卡驱动
- nginx简介及作用
热门文章
- matlab radn,如何用matlab编写randn函数?
- 三、ResNet50预置算法提高美食分类识别精确度
- 四十一、完成scrapy爬取官方网站新房的数据
- 工程制图 (立体投影)
- sklearn模型的训练(上)
- AAAI 2022 | 条件局部图卷积网络用以气象预测
- 来试试读论文的新神器!AMiner发布“论文背景文献”一键生成工具,帮你搞清一篇论文的“来龙去脉”...
- 知识库问答中的关系识别研究回顾
- 再谈类别不平衡问题:调节权重与魔改Loss的综合分析
- ACL 2020 | 知识库问答的多跳复杂问题查询图生成