题:实现单例模式
单例模式,也叫单件模式,是一种常见的软件设计模式。单例模式确保一个类只有一个实例,并提供
有一些对象我们只需要一个,比方说:线程池(threadpool
)、缓存(cache
)、日志对象等等。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。
保证只有一个对象,省略了后续创建对象所花费的时间,也减轻了垃圾回收的压力(GC
)
实现单例模式的关键是
-
保证对象只有一个
-
线程安全
首先来看python
,能使用__init__
方法来限制的对象的初始化吗?实际上,__init__
并不是构造函数,__init__
干的是创建好对象后初始化变量。真正创建实例的是__new__
方法。下面是python
实现的单例模式:
class Singleton(object):
_instances = {}
_lock = Lock()
def __new__(cls, *args, **kw):
# 如果不存在实例,则需要加锁创建新的实例,减少程序不必要的加锁
if cls not in cls._instances:
# sleep 1s 现象更容易出现
# time.sleep(1)
with cls._lock:
# Double-checked_locking pattern.
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instances[cls]
class MyClass(Singleton):
a = 1
go
的实现,使用sync.Once
来确保多个goroutine
同时进行处理的时候,操作只执行了一次,从而保证线程安全。
package singleton
import (
"sync"
)
type singleton map[string]string
var (
once sync.Once
instance singleton
)
func New() singleton {
once.Do(func() {
instance = make(singleton)
})
return instance
}
完整示例代码见:https://github.com/yunqingqing/exercise/tree/master/code/python/day2