zoukankan      html  css  js  c++  java
  • 单例的多线程使用

    前一篇文章介绍了什么是单例模式以及如何使用单例模式。那么在多线程程序中我们如何使用单例模式呢?也就是说在多线程中我们如何保证类实例的唯一性?

    众所周知,多线程中使用较多的是锁lock。

    lock是确保一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他的线程试图进入锁定的代码,将一直等待(被阻止)直到该对象被释放。

    程序运行时创建一个静态只读的线程辅助对象:

    public static readonly object syncroot=new object();

    在同一时刻加锁的那部分代码只能被一个线程访问:

    lock(syncroot)

    {

    if(instance==null)

    {

      instance=new singleton();

    }

    }

    上面的代码每次进行调用时都需要加锁lock,对性能有一定影响。可以先判断实例是否存在,不存在再加锁lock。

    if(instance==null)

    {

    lock(syncroot)

    {

    if(instance==null)

    {

      instance=new objec();

    }

    }

    }

    上面的代码中,对实例是否为空我们进行了两次判断,为什么呢?

    当实例instance==null时,两个线程同时调用上面的代码,第一重条件都符合可以进入。此时由于lock机制,只能一个线程进入,另一个线程等候。这里如果没有第二重是否为null条件判断,第一个线程执行实例化对象退出后,第二个线程进入会再一次实例化对象。这样就没有达到我们单实例的目的。

    寻找突破。。。
  • 相关阅读:
    MYSQL编码转换的问题latin1转utf8
    Java中的局部内部类
    Java中的抽象类和接口
    Java中的构造方法
    使用Java打印杨辉三角
    Java中的数组越界问题
    Java虚拟机中的内存分配
    关于iOS10 Xcode8真机测试项目出现的问题 "code signing is required for product type 'xxxxx' in SDK 'iOS 10.0"..
    Java语言的学习
    关于导航栏设置状态栏样式问题
  • 原文地址:https://www.cnblogs.com/iskyoole/p/2547125.html
Copyright © 2011-2022 走看看