kotlin介绍,谈谈对kotlin的理解
六种独生子女模式1。饥饿模式:静态最终场2。懒惰模式:线程不安全3。线程安全懒惰模式4。双重检查锁类型5。静态内部类类型6。枚举1。Hungry模式:静态final字段,由于hungry在创建对象实例时比较着急,所以在加载类时创建。
这个方法非常简单,因为singletons的实例被声明为static和final变量,这些变量将在类第一次加载到内存中时被初始化,所以实例的创建是线程安全的。
//Java实现
公共类Singleton{
//类在加载时被初始化
private static final Singleton实例=new Singleton();
私有Singleton(){}
公共静态Singleton getInstance(){
返回实例;
}
} Kotlin引入了object type,可以轻松声明singleton模式。
//Kotlin实现
单一对象{
趣味测试(){}
}这种方法和饥饿中文风格的Java singleton模式一样,但是比Java实现的代码量少很多。其实就是个语法糖果(Kotlin到处都是语法糖果)。反编译生成的类文件如下:
公共最终类Singleton {
公共静态最终单例实例;
公共最终无效测试(){
}
私有Singleton() {
}
静态{
Singleton var 0=new Singleton();
INSTANCE=var0
}
}//java调用
单身。INSTANCE.test()
//科特林
如果构造方法中有耗时的操作,那么这个类的加载会很慢。饥饿型从一开始就创建实例,但是没有调用,会浪费资源。还有一个Java Hungry singleton模式没有的问题:构造函数不能自定义,object中不允许使用构造函数,需要使用init{} 2。懒惰模式:线程不安全//Java实现
公共类SingletonDemo {
私有静态SingletonDemo实例;
private SingletonDemo(){}
公共静态SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
返回实例;
}
}//Kotlin实现
类SingletonDemo私有构造函数(){
伴随对象{
私有var实例:SingletonDemo?=空
get() {
if (field==null) {
field=SingletonDemo()
}
返回字段
}
fun get(): SingletonDemo{
//细心的朋友一定发现了。getInstance在这里不用作方法名,
//因为声明伴生对象时内部已经有一个getInstance方法,所以只能取其他名字。
返回实例!
}
}
}3.线程安全的懒惰模式//Java实现
公共类SingletonDemo {
私有静态SingletonDemo实例;
private SingletonDemo(){}
公共静态同步单例演示getinstance(){//使用同步锁
if(instance==null){
instance=new SingletonDemo();
}
返回实例;
}
}//Kotlin实现
类SingletonDemo私有构造函数(){
伴随对象{
私有var实例:SingletonDemo?=空
get() {
if (field==null) {
field=SingletonDemo()
}
返回字段
}
@同步
fun get(): SingletonDemo{
返回实例!
}
}
}大家都知道使用懒惰模式会有线程安全问题,需要使用同步锁。在Kotlin中,如果需要将一个方法声明为synchronous,就需要添加@Synchronized注释。
4.双重检查锁定模式,这是一种使用同步块的锁定方法。程序员称之为双重检查锁,因为会有两次检查,例如instance==null,一次在同步块外部,一次在同步块内部。为什么必须在同步块中再次检查?因为可能有多个线程一起进入同步块之外的if,所以如果同步块中没有辅助检查,就会生成多个实例。
//Java实现
公共类Singleton{
/**
*不稳定担保:
* 1.多线程中实例的并发可见性
* 2.禁止在运行过程中对实例的指令进行重新排序。
*/
private volatile static Singleton实例=null
公共静态Singleton get instance(){
//第一次空判断保证了不必要的同步。
if(instance==null){
//synchronized将全局锁放在Singleton上,以确保一次只有一个线程创建一个实例。
synchronized(Singleton.class){
//以便在第二次null判断时,在null的情况下创建实例。
if(instance==null){
instance=new Singleton();
}
}
}
返回实例;
}
}具体原理参考:
以及Java Kotlin下的六种singleton模式//kotlin实现
类SingletonDemo私有构造函数(){
伴随对象{
val实例:SingletonDemo by lazy(mode=LazyThreadSafetyMode。同步){
SingletonDemo()
}
}
}具体实施原则可以参考:
Kotlin下的5种singleton模式Java和6种singleton模式5。Kotlin下的静态内部类。《Effective Java》上也推荐这个方法。
//Java实现
公共类Singleton{
私有静态类SingletonHolder{
private static final Singleton实例=new Singleton();
}
私有Singleton(){}
public static final Singleton getInstance(){
返回SingletonHolder。实例;
}
}这种编写方式还是用JVM自己的机制来保证线程安全。
因为静态singleton对象没有被直接实例化为Singleton的成员变量,所以在加载类时不会实例化Singleton。第一次调用getInstance()时,内部类SingletonHodler,静态类型的变量实例在内部类中定义。这时这个成员变量会先被初始化,Java虚拟机会保证它的线程安全,保证这个成员变量只能被初始化一次。因为getInstance()方法没有任何线程锁,所以它的性能不会有任何影响。
由于SingletonHodler是私有的,除了getInstance()之外没有别的方法可以访问,所以它比较懒,在同时读取实例的时候不会同步。它没有性能缺陷,不依赖于JDK版本。//Kotlin实现
类单例私有构造函数(){
伴随对象{
val instance=singleton holder . holder
}
私有对象SingletonHolder {
val holder=Singleton()
}
}类Singletone私有构造函数(){
初始化{
println(使用对象:$this初始化)
}
伴随对象{
val getInstance=singleton holder . holder
}
私有对象SingletonHolder {
val holder=Singletone()
}
fun print()=println(用object: $this 打印)
}
//用法
Singletone.getInstance.print()
Singletone.getInstance.print()
//输出
使用对象初始化:advance。Singletone@266474c2
带对象打印:高级。Singletone@266474c2
用object:advance . single tone @ 266474 c 26打印。枚举:枚举//Java实现
公共枚举EasySingleton{
实例;
}创建枚举默认是线程安全的,所以不需要担心双重检查锁定,也可以防止反序列化重新创建新对象。
//Kotlin实现
枚举类EasySingleton{
实例;
}
版权归作者所有:博主曲乐优香原创作品,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。