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条件判断,第一个线程执行实例化对象退出后,第二个线程进入会再一次实例化对象。这样就没有达到我们单实例的目的。

    寻找突破。。。
  • 相关阅读:
    phpcms后台进入地址(包含No permission resources错误)
    phpmyadmin上传大sql文件办法
    ubuntu彻底卸载mysql
    Hdoj 2602.Bone Collector 题解
    一篇看懂词向量
    Hdoj 1905.Pseudoprime numbers 题解
    The Python Challenge 谜题全解(持续更新)
    Hdoj 2289.Cup 题解
    Hdoj 2899.Strange fuction 题解
    Hdoj 2199.Can you solve this equation? 题解
  • 原文地址:https://www.cnblogs.com/iskyoole/p/2547125.html
Copyright © 2011-2022 走看看