一、单利设计模式。
(考点:单例、恶汉式、懒汉式、线程、同并、同步函数、同步代码块、线程锁、效率 )
1.懒汉模式
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil)
{
sharedGizmoManager = [[MyGizmoClass alloc] init];
}
return sharedGizmoManager;
}
面试中,我们可能会经常碰到单例的问题,要求我们写一个单例的代码,所以啊这里我们最好要记住,哪怕是背也要背下来。可是面试官是考我们知道不知道单例问题吗?
NO的,写完后(如果你写出来,写不出来,就直接走人吧),会问你,有什么问题吗?
回答必须是有的!没有他能问你啊???
当我们用多线程的获取单例实例的时候,看图吧还是
解决方法1:同步代码块。
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self)
{
if (sharedGizmoManager == nil)
{
sharedGizmoManager = [[MyGizmoClass alloc] init];
}
}
return sharedGizmoManager;
}
可是大家发现,这和同步函数有区别吗?木有啊,这不还是一样要判断锁嘛,所以这是还有问题的,怎么解决?我们在synchronized外面再加一层判断,判断sharedGizmoManager是否为空再看一下
解决方法2:同步代码块+双层判断。
双重if()判断是否为空,提高效率,咋提高呢?
当第一次t1进来的时候返回了一个sharedGizmoManager,其他线程进来后一上来不是判断的锁而是判断是否为空,是否有sharedGizmoManager,所以怎么样,问题就解决啦,面试官就搞定啦!O(∩_∩)O哈哈~
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil)
{
@synchronized(self)
{
if (sharedGizmoManager == nil)
{
sharedGizmoManager = [[MyGizmoClass alloc] init];
}
}
}
return sharedGizmoManager;
}
如果面试官要是问这道题,一定要把能想到的都说出来,表现的时候到了啊
2.饿汉模式
static MyGizmoClass *sharedGizmoManager =[[MyGizmoClass alloc] init];
+ (MyGizmoClass*)sharedManager
{
return sharedGizmoManager;
}
饿汉模式不存在安全隐患,可放心使用哦。