Kotlin实战指南十六:Synchronized、Volatile

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/116267707
本文出自【赵彦军的博客】

如何创建线程 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 = true
    if (priority > 0)
        thread.priority = priority
    if (name != null)
        thread.name = name
    if (contextClassLoader != null)
        thread.contextClassLoader = contextClassLoader
    if (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 {

    @Synchronized
    fun 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 {

    @Volatile
    var 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)

在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值