Kotlin与Java的几种单例模式
一、饿汉式(线程安全,调用效率高,但是不能延时加载)
JAVA例子:
public class Test {private static Test test = new Test();private Test() {}public static Test getInstance() {return test;}// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
object Test1 {// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.getInstance().printTest()
Test1.printTest()
输出结果:
二、懒汉式(线程安全,调用效率不高,但是能延时加载)
Java例子:
public class Test {private static Test test;private Test() {}public static Test getInstance() {if (test == null) {test = new Test();}return test;}// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
class Test1 private constructor() {companion object {private var test1: Test1? = nullget() {if (field == null) {field = Test1()}return field}fun getInstance(): Test1 {return test1!!}}// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.getInstance().printTest()
Test1.getInstance().printTest()
输出结果:
三、线程安全的懒汉式
Java例子:
public class Test {private static Test test;private Test() {}public static synchronized Test getInstance() {if (test == null) {test = new Test();}return test;}// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
class Test1 private constructor() {companion object {private var test1: Test1? = nullget() {if (field == null) {field = Test1()}return field}@Synchronizedfun getInstance(): Test1 {// !!表示该属性一定不能为Null,否则将抛出空指针异常错误导致crashreturn test1!!}}// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.getInstance().printTest()
Test1.getInstance().printTest()
输出结果:
四、双重校验锁式双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用)
Java例子:
public class Test {// volatile关键字保证了test成员变量的可见性,一定程度上保护了线程的安全// new 操作不是原子操作,在 JVM 层面会导致重排序// volatile在此主要是禁止重排序(synchronized只能保证有序性却不能禁止重排序)private volatile static Test test;private Test() {}public static Test getInstance() {if (test == null) {synchronized (Test.class) {if (test == null) {test = new Test();}}}return test;}// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
class Test1 private constructor() {companion object {// lazy是Kotlin的延迟属性val test1: Test1 by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {Test1()}}// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.getInstance().printTest()
Test1.test1.printTest()
输出结果:
五、静态内部类式(线程安全,调用效率高,可以延时加载)
Java例子:
public class Test {private static class Singleton {private static Test test = new Test();}private Test() {}public static Test getInstance() {return Singleton.test;}// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
class Test1 private constructor() {companion object {val test1 = Singleton.singleton}private object Singleton {val singleton = Test1()}// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.getInstance().printTest()
Test1.test1.printTest()
输出结果:
六、枚举类实现单例(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)
Java例子:
public enum Test {// 枚举元素本身就是单例INSTANCE;// 忽略方法printTest(),仅用来输出public void printTest() {System.out.println("maisomgan:java-test");}
}
Kotlin例子:
enum class Test1 {// 枚举元素本身就是单例INSTANCE;// 忽略方法printTest(),仅用来输出fun printTest() {println("maisomgan:kotlin-test")}
}
在Kotlin代码类型中进行调用:
Test.INSTANCE.printTest()
Test1.INSTANCE.printTest()
输出结果:
如何选用:
单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉
单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式
Kotlin与Java的几种单例模式相关推荐
- JAVA中N种单例模式简单概括(防反射,克隆,序列化,实例化,多线程安全)
里面包括了老生常谈的饿汉式,懒汉式以及枚举类 静态代码块 序列化场景下,多线程场景下反射情况下的问题. 话不多说,直接开干. 饿汉式就是立即加载的意思,立即加载在中文中有着急,急迫的意思.所以就叫饿汉 ...
- java测试时间的类,java 测试五种单例模式需要的时间
public class Test { public static void main(String[] args) { long start=System.currentTimeMillis(); ...
- kotlin和java语言_Kotlin VS Java – 2020年您应该学习哪种编程语言?
kotlin和java语言 It has been several years since Kotlin came out, and it has been doing well. Since it ...
- java两种绑定方式_java两种单例模式用法分析
本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...
- Java单例模式详解--七种单例模式实现+单例安全+实际应用场景
单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...
- java中的单例_细说Java中的几种单例模式
在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Double check(双重检索) 静态内部类 枚举单例 一.饿汉式 image 饿汉式 ...
- java中的7种单例模式
java中的7种单例模式 单例模式是我们开发中经常会用到的,单例模式的好处是应用在运行时只有一个实例,生命周期从单例实例化后一直到应用生命周期结束.这里总结和比较一下几种单例的形式,共总结了七种. 写 ...
- java 多线程的单例模式,Java多线程中的单例模式两种实现方式
Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...
- 入门 Kotlin 和 Java 混合开发
一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...
最新文章
- 华为首款Harmonyos摄像头,掀起家居安防大变革 华为首款HarmonyOS智能摄像头发布...
- a java虚拟机_Java虚拟机
- CV Code | 计算机视觉开源周报20191002期
- python从入门到实践答案第四章_python从入门到实践课后习题第四章
- C#基于Linq和反射实现数据持久化框架Xml4DB
- 关于如何打开一张jpg图片文件并存放到vector unsigned char中的讨论
- 基于matlab的CIC滤波器仿真
- 打印机显示正在未连接服务器,打印机状态未联机是怎么回事
- 互联网大厂数据分析面试常见问题及解法,建议收藏
- lintcode刷题——罗马数字转整数
- MainMenu.xib
- LED背光源的使用寿命多久?
- Vue中三元运算符多种状态判断
- 1 errors and 0 warnings potentially fixable with the --fix option
- python输出语句print(3+5)_Python 3 print 函数用法总结
- 图床,全网最稳定的免费图床
- Jquery 广告图片轮播切换
- 微服务启动报错:Shutting down DiscoveryClient
- 13 个 Mongodb GUI 可视化管理工具,总有一款适合你
- 《Fundamentals Of Computer Graphics》虎书第三版翻译——第五章 线性代数