单例的多线程环境下的使用
2017-04-04 16:48
232 查看
什么是单例模式?
如何使用单例模式?
在多线程程序中我们如何使用单例模式呢?也就是说在多线程中我们如何保证类实例的唯一性?
众所周知,多线程中使用较多的是锁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条件判断,第一个线程执行实例化对象退出后,第二个线程进入会再一次实例化对象。这样就没有达到我们单实例的目的。
参考:http://www.cnblogs.com/iskyoole/archive/2012/06/12/2547125.html
如何使用单例模式?
在多线程程序中我们如何使用单例模式呢?也就是说在多线程中我们如何保证类实例的唯一性?
众所周知,多线程中使用较多的是锁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条件判断,第一个线程执行实例化对象退出后,第二个线程进入会再一次实例化对象。这样就没有达到我们单实例的目的。
参考:http://www.cnblogs.com/iskyoole/archive/2012/06/12/2547125.html
相关文章推荐
- 在多线程环境下使用HttpWebRequest或者调用Web Service
- 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
- 【使用线程池的好处】多线程的环境中,尽量采用线程池
- 在多线程环境下使用HttpWebRequest或者调用Web Service(连接报超时问题)
- [原]Java多线程编程学习笔记之七:多线程环境中安全使用集合API(含代码)
- 在多线程环境下使用HttpWebRequest或者调用Web Service
- 【使用线程池的好处】多线程的环境中,尽量采用线程池
- 多线程、多平台环境中的跟踪 - 使用 log4j 和 UNIX 命令来挖掘跟踪数据
- mktime和localtime_r能在多线程环境下使用么?
- 多线程环境下使用openssl
- 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
- 多线程环境下使用log4j输出各线程的标识,区分各线程输出的内容
- 在多线程环境下使用HttpWebRequest或者调用Web Service
- 多线程环境下OTL的使用
- 介绍如何使用 POSIX 库在多线程环境中设计并发数据结构
- 使用pthread库进行多线程编程1 - UNIX环境高级编程第11章读书笔记
- CSocket在多线程环境下使用Static库出错的解决办法
- Writing multithreaded ArcObjects code(多线程环境使用AO)
- 【Java并发编程】之八:多线程环境中安全使用集合API(含代码)
- 【Java并发编程】之八:多线程环境中安全使用集合API(含代码)