标签: singleton

C++中单例的线程安全延迟构造

有没有办法在C++中实现单例对象:

  1. 懒惰地以线程安全的方式构造(两个线程可能同时是单例的第一个用户 - 它应该仍然只构造一次).
  2. 不依赖于事先构造的静态变量(因此单例对象在构造静态变量期间本身是安全的).

(我不太了解我的C++,但是在执行任何代码之前初始化积分和常量静态变量的情况(即,甚至在执行静态构造函数之前 - 它们的值可能已在程序中"初始化")如果是这样的话 - 也许这可以被利用来实现单例互斥体 - 这反过来可以用来保护真正的单例的创建......)


很好,现在我似乎有几个好的答案(羞耻我不能标记2或3作为答案).似乎有两个广泛的解决方案:

  1. 使用POD静态变量的静态初始化(而不是动态初始化),并使用内置原子指令实现我自己的互斥锁.这是我在问题中暗示的那种解决方案,我相信我已经知道了.
  2. 使用其他库函数,如pthread_onceboost :: call_once.这些我当然不知道 - 并且非常感谢所发布的答案.

c++ singleton construction multithreading lazy-initialization

36
推荐指数
5
解决办法
2万
查看次数

好吧,全局变量被谴责,单身人士被鄙视,还有什么选择?

对于桌面应用程序.这只是一个普遍的问题,可能只需要一般的答案.

singleton global-variables

36
推荐指数
4
解决办法
2万
查看次数

ASP .NET Singleton

只是想确保我在这里假设一些愚蠢的东西,在ASP .Net Web应用程序中实现单例模式时,静态变量作用域仅适用于当前用户会话,对吧?如果第二个用户正在访问该站点,那么它是一个不同的内存范围......?

c# asp.net singleton static

36
推荐指数
3
解决办法
3万
查看次数

StructureMap单例用法(一个实现两个接口的类)

public interface IInterface1
{
}

public interface IInterface2
{
}

public class MyClass : IInterface1, IInterface2
{
}

...

ObjectFactory.Initialize(x =>
{
    x.For<IInterface1>().Singleton().Use<MyClass>();
    x.For<IInterface2>().Singleton().Use<MyClass>();
});

var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();
Run Code Online (Sandbox Code Playgroud)

我用上面的代码得到了两个不同的MyClass实例.我该怎么办?

c# structuremap singleton

36
推荐指数
2
解决办法
1万
查看次数

Linux上的共享库中的多个单例实例

正如标题所提到的,我的问题很明显,我详细描述了这个场景.在文件singleton.h中有一个名为singleton的类,由singleton模式实现,如下所示:

/*
 * singleton.h
 *
 *  Created on: 2011-12-24
 *      Author: bourneli
 */

#ifndef SINGLETON_H_
#define SINGLETON_H_

class singleton
{
private:
    singleton() {num = -1;}
    static singleton* pInstance;
public:
    static singleton& instance()
    {
        if (NULL == pInstance)
        {
            pInstance = new singleton();
        }
        return *pInstance;
    }
public:
    int num;
};

singleton* singleton::pInstance = NULL;

#endif /* SINGLETON_H_ */
Run Code Online (Sandbox Code Playgroud)

然后,有一个名为hello.cpp的插件如下:

#include <iostream>
#include "singleton.h"

extern "C" void hello() {
    std::cout << "singleton.num in hello.so : " << singleton::instance().num << std::endl;
    ++singleton::instance().num; …
Run Code Online (Sandbox Code Playgroud)

c++ singleton dlopen

36
推荐指数
2
解决办法
2万
查看次数

DocumentBuilder线程安全吗?

我正在查看的当前代码库使用DOM解析器.以下代码片段在5种方法中重复:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 DocumentBuilder builder = factory.newDocumentBuilder();
Run Code Online (Sandbox Code Playgroud)

如果在循环中调用包含上述代码的方法,或者在应用程序中多次调用该方法,那么我们将承担为每次调用此类方法创建新的DocumentBuilderFactory实例和新的DocumentBuilder实例的开销.

在DocumentBuilder工厂和DocumentBuilder实例周围创建一个单独的包装器是一个好主意,如下所示:

public final class DOMParser {
   private DocumentBuilderFactory = new DocumentBuilderFactory();
   private DocumentBuilder builder;

   private static DOMParser instance = new DOMParser();

   private DOMParser() {
      builder = factory.newDocumentBuilder();
   }

   public Document parse(InputSource xml) {
       return builder.parser(xml);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果上述单例在多个线程之间共享,是否会出现任何问题?如果没有,通过在应用程序的整个生命周期中使用上述创建DocumentBuilderFactory和DocumentBuilder实例的方法,是否会有任何性能提升?

编辑:

我们唯一能遇到问题的是,如果DocumentBuilder在解析可能影响解析下一个XML文件的XML文件时保存了一些状态信息.

java performance singleton multithreading dom

36
推荐指数
2
解决办法
3万
查看次数

WPF单实例最佳实践

这是我到目前为止实现的代码,用于创建单个实例WPF应用程序:

#region Using Directives
using System;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Windows;
using System.Windows.Interop;
#endregion

namespace MyWPF
{
    public partial class MainApplication : Application, IDisposable
    {
        #region Members
        private Int32 m_Message;
        private Mutex m_Mutex;
        #endregion

        #region Methods: Functions
        private IntPtr HandleMessages(IntPtr handle, Int32 message, IntPtr wParameter, IntPtr lParameter, ref Boolean handled)
        {
            if (message == m_Message)
            {
                if (MainWindow.WindowState == WindowState.Minimized)
                    MainWindow.WindowState = WindowState.Normal;

                Boolean topmost = MainWindow.Topmost;

                MainWindow.Topmost = true;
                MainWindow.Topmost = topmost;
            }

            return IntPtr.Zero;
        } …
Run Code Online (Sandbox Code Playgroud)

c# wpf singleton mutex

36
推荐指数
7
解决办法
4万
查看次数

Scala中单例对象的说明

我得到的编码是,你基本上提供了一个"对象SomeClass"和一个"类SomeClass",伴侣类是类声明,对象是一个单例.其中您无法创建实例.所以...我的问题主要是在这个特定实例中单个对象的目的.

这基本上只是一种在Scala中提供类方法的方法吗?像Objective-C中的+基础方法一样?

我正在阅读Scala编程书和第4章刚刚谈到的单例对象,但它没有详细说明为什么这很重要.

我意识到我可能会在这里超越自己,以后可能会对此进行更详细的解释.如果是这样,请告诉我.到目前为止,这本书相当不错,但它有很多"Java,你这样做",但我的Java经验很少,我有点想念我的一点点.我不希望这是其中一种情况.

我不记得在Scala网站上的任何地方阅读Java是阅读本书的先决条件......

singleton scala

35
推荐指数
2
解决办法
2万
查看次数

Singleton:如何通过Reflection停止创建实例

我知道在Java中,我们可以通过创建一个类的实例new,clone(),Reflectionserializing and de-serializing.

我创建了一个实现Singleton的简单类.

我需要一直停止创建我的类的实例.

public class Singleton implements Serializable{
    private static final long serialVersionUID = 3119105548371608200L;
    private static final Singleton singleton = new Singleton();
    private Singleton() { }
    public static Singleton getInstance(){
        return singleton;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Cloning of this class is not allowed"); 
    }
    protected Object readResolve() {
        return singleton;
    }
    //-----> This is my implementation to stop it but Its not working. …
Run Code Online (Sandbox Code Playgroud)

java reflection singleton

35
推荐指数
4
解决办法
4万
查看次数

从非活动单例类中获取应用程序上下文

在我的android项目中,我有ImageAdapter类,我在其中传递应用程序上下文以满足其他需求.

public class ImageAdapter extends BaseAdapter {
    private Context c;

    public ImageAdapter(Context c) {
            this.c = c;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

问题是我想让ImageAdapter成为一个单例,以便从我的所有活动中轻松访问这个类的实例.但是我不知道如何将getApplicationContext()方法中的app context从我的一个活动传递给ImageAdapter.所以有没有"神奇"做到这一点如下?

public class ImageAdapter extends BaseAdapter {

    private Context c;

    private static class Holder {
            public static final ImageAdapter IA = new ImageAdapter();
    }

    private ImageAdapter() {
            this.c = /* some magic here */.getApplicationContext();
    }

    public static ImageAdapter getInstance() {
            return Holder.IA;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

也许你有一些其他的想法,可以为我的任何活动分享ImageAdapter.我是android的新手,我对在活动中传递数据的方式有点困惑.

我将不胜感激任何帮助.

java singleton android android-context baseadapter

35
推荐指数
2
解决办法
5万
查看次数