一、饿汉式(线程安全,调用效率高,但是不能延时加载)

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的几种单例模式相关推荐

  1. JAVA中N种单例模式简单概括(防反射,克隆,序列化,实例化,多线程安全)

    里面包括了老生常谈的饿汉式,懒汉式以及枚举类 静态代码块 序列化场景下,多线程场景下反射情况下的问题. 话不多说,直接开干. 饿汉式就是立即加载的意思,立即加载在中文中有着急,急迫的意思.所以就叫饿汉 ...

  2. java测试时间的类,java 测试五种单例模式需要的时间

    public class Test { public static void main(String[] args) { long start=System.currentTimeMillis(); ...

  3. 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 ...

  4. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  5. Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...

  6. java中的单例_细说Java中的几种单例模式

    在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Double check(双重检索) 静态内部类 枚举单例 一.饿汉式 image 饿汉式 ...

  7. java中的7种单例模式

    java中的7种单例模式 单例模式是我们开发中经常会用到的,单例模式的好处是应用在运行时只有一个实例,生命周期从单例实例化后一直到应用生命周期结束.这里总结和比较一下几种单例的形式,共总结了七种. 写 ...

  8. java 多线程的单例模式,Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...

  9. 入门 Kotlin 和 Java 混合开发

    一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...

最新文章

  1. 华为首款Harmonyos摄像头,掀起家居安防大变革 华为首款HarmonyOS智能摄像头发布...
  2. a java虚拟机_Java虚拟机
  3. CV Code | 计算机视觉开源周报20191002期
  4. python从入门到实践答案第四章_python从入门到实践课后习题第四章
  5. C#基于Linq和反射实现数据持久化框架Xml4DB
  6. 关于如何打开一张jpg图片文件并存放到vector unsigned char中的讨论
  7. 基于matlab的CIC滤波器仿真
  8. 打印机显示正在未连接服务器,打印机状态未联机是怎么回事
  9. 互联网大厂数据分析面试常见问题及解法,建议收藏
  10. lintcode刷题——罗马数字转整数
  11. MainMenu.xib
  12. LED背光源的使用寿命多久?
  13. Vue中三元运算符多种状态判断
  14. 1 errors and 0 warnings potentially fixable with the --fix option
  15. python输出语句print(3+5)_Python 3 print 函数用法总结
  16. 图床,全网最稳定的免费图床
  17. Jquery 广告图片轮播切换
  18. 微服务启动报错:Shutting down DiscoveryClient
  19. 13 个 Mongodb GUI 可视化管理工具,总有一款适合你
  20. 《Fundamentals Of Computer Graphics》虎书第三版翻译——第五章 线性代数

热门文章

  1. 【AR】Vuforia之unity3d 开发环境搭建
  2. 根据字段的不同内容分类汇总 - 球队的胜负次数统计
  3. PHP中$_SERVER的详细参数与说明
  4. 命名实参和可选实参(C#)
  5. http_build_query用法,挺方便的
  6. 虚拟机共享文件夹引发的一点思考
  7. 安装后系统配置及优化
  8. 记一个自认为写得有点复杂的sql语句
  9. 20155338 《网络攻防》 Exp7 网络欺诈防范
  10. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA