如果多个线程试图访问单个对象会发生什么

时间:2009-08-24 13:42:36

标签: singleton

不是在实例化期间,但是一旦完成单例对象的实例化,如果两个或多个线程试图访问同一个单例对象会发生什么?特别是在单例对象需要大量时间来处理请求的情况下(例如1分钟)......在这种情况下,如果例如5个线程尝试访问同一个单例对象,结果会是什么? / p>

附加问题:通常我们何时应该采用单身模式,何时应该避免使用?

5 个答案:

答案 0 :(得分:5)

除非在Singleton中执行同步(锁定),否则答案是这样的:它是免费的。

虽然Singleton确保在请求时只使用一个对象实例,但该模式本身并不提供任何形式的线程安全性。这取决于实施者。

在您引用的特定情况下(使用长时间运行的方法),将访问同步到使用类或对象级变量的任何方法至关重要。如果不这样做,很可能会导致竞争条件。

祝你好运!

答案 1 :(得分:2)

我用于单身人士的一般经验法则是它不应该影响正在运行的代码,并且没有副作用。基本上对我来说,在我的项目中,这转换为某种日志记录功能或静态值查找(即从数据库加载一些常见数据并将其存储以供参考,因此不必在每次需要时读取)

答案 2 :(得分:0)

除了只有一个实例之外,单例与任何其他对象没有区别。当您尝试访问它时会发生什么,这在很大程度上取决于访问线程正在尝试什么(即读取与写入)以及您的单例所持有的数据类型。

答案 3 :(得分:0)

你问题的答案就是“它真的取决于”。什么样的单身人士?即它做了什么,它是如何做到的?用什么语言?

现实是,单身模式)只能指示和强制你只能拥有某个特定对象的一个​​实例。本身并没有说明访问该对象的多个线程。

因此,如果编码正确(正确实现了线程同步),则没有理由说它不能正常运行 - 即使对对象的请求需要很长时间才能处理!

答案 4 :(得分:0)

然后你需要线程安全的单例模式实现。

查找对this有用的文章,该文章描述了单例模式的大多数多线程场景。

HTH!