kotlin介绍,谈谈对kotlin的理解

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: