多线程练习 -- 单例设计模式

Singleton.h

#define singleton_h(name) + (instancetype)shared##name;

#if __has_feature (objc_arc)

#define singleton_m(name) static id _instance; + (id)allocWithZone:(struct _NSZone *)zone {     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{         _instance = [super allocWithZone:zone];     });     return _instance; } + (instancetype)sharedOnlyoneClass {     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{         _instance = [[self alloc] init];     });     return _instance; }

#else

#define singleton_m(name) static id _instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (instancetype)shared##name { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } - (oneway void)release {    } - (id)retain {    return _instance; } - (NSUInteger)retainCount {     return 1; } - (id)autorelease {     return _instance; } + (id)copyWithZone:(struct _NSZone *)zone {     return _instance; } + (id)mutableCopyWithZone:(struct _NSZone *)zone {     return _instance; }

#endif

LWTOnlyoneClass.h

#import <Foundation/Foundation.h>
#import "Singleton.h"

@interface LWTOnlyoneClass : NSObject

@property (nonatomic, copy) NSString *name;

singleton_h(OnlyoneClass)

@end

LWTOnlyoneClass.m

//
//  LWTOnlyoneClass.m
//  多线程练习 -- 单例设计模式
//
//  Created by apple on 14-6-24.
//  Copyright (c) 2014年 lwt. All rights reserved.
//

#import "LWTOnlyoneClass.h"

@implementation LWTOnlyoneClass

- (instancetype)init
{
    self = [super init];
    if (self) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            self.name = @"jack";
        });
    }
    return self;
}

singleton_m(OnlyoneClass)

@end

LWTViewController.h

#import <UIKit/UIKit.h>

@interface LWTViewController : UIViewController

@end

LWTViewController.m

//
//  LWTViewController.m
//  多线程练习 -- 单例设计模式
//
//  Created by apple on 14-6-24.
//  Copyright (c) 2014年 lwt. All rights reserved.
//

#import "LWTViewController.h"
#import "LWTOnlyoneClass.h"

@interface LWTViewController ()

@end

@implementation LWTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    LWTOnlyoneClass *onlyone1 = [[LWTOnlyoneClass alloc] init];
    LWTOnlyoneClass *onlyone2 = [LWTOnlyoneClass sharedOnlyoneClass];
    onlyone2.name = @"Tom";
    LWTOnlyoneClass *onlyone3 = [[LWTOnlyoneClass alloc] init];
    onlyone3.name = @"rose";
    LWTOnlyoneClass *onlyone4 = [LWTOnlyoneClass sharedOnlyoneClass];
    onlyone4.name = @"jim";

//#if __has_feature (objc_arc)
//    LWTOnlyoneClass *onlyone5 = [LWTOnlyoneClass sharedOnlyoneClass];
//    LWTOnlyoneClass *onlyone6 = [LWTOnlyoneClass sharedOnlyoneClass];
////#else
//    LWTOnlyoneClass *onlyone5 = [onlyone2 copy];
//    LWTOnlyoneClass *onlyone6 = [onlyone3 mutableCopy];
//#endif

    NSLog(@"%p -- %p -- %p -- %p", onlyone1, onlyone2, onlyone3, onlyone4);
    NSLog(@"%@ -- %@ -- %@ -- %@", onlyone1.name, onlyone2.name, onlyone3.name, onlyone4.name);
}

@end

多线程练习 -- 单例设计模式

时间: 2024-11-09 01:06:21

多线程练习 -- 单例设计模式的相关文章

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

(单例设计模式中)懒汉式与饿汉式在多线程中的不同

/* 目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同! 开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题! 而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高! */ /* class SinglePerson implements Runnable{ private static SinglePerson ss = new SinglePerson("hjz", 22);//恶汉式 private int age; privat

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

黑马程序员——多线程下的单例设计模式的安全问题

//多线程下的单例设计模式 class Sing { //饿汉式不存在安全问题,因为其不是线程同步的 private static Sing s = new Sing(); private Sing(){} public static Sing getInstance() { return s; } } class Single { private static Single s = null; private Single(){} public static Single getInstanc

iOS核心笔记——多线程-单例设计模式

1.单例设计模式: 2.单例设计模式实现(ARC模式): 2-1.单例设计模式步骤: ?重要:①提供一个静态全局变量:②重写allocWithZone方法,使用一次性方法保证只分配一次存储空间.③提供快速创建单例对象的类方法:④严谨起见,还应重写copyWithZone.mutableCopyWithZone方法. 2-2.确保内存分配: 2-3.提供类方法: 3.单例模式三个问题: ?重要:①:怎么实现一个单例模式?(重写allocWithZone方法)②:内部是怎么确保只分配一次内存?(在a

单例设计模式和多线程

单例设计模式 单例:整个项目中,有某个类或者某些特殊的类,属于该类的对象只能建立一个. #include<iostream> using namespace std; class MyCAS { private: MyCAS(){} private: static MyCAS *m_instance; public: static MyCAS *GetInstance() ///得到对象的接口函数 { if(m_instance==NULL) { m_instance = new MyCAS(

设计模式之单例设计模式

一.何为单例设计模式 单例模式,顾名思义就是单个实例,程序中某个类只有一个实例存在.通常实在需要共享某个资源避免资源损耗的情况下使用到的. 二.单例设计模式的代码实现 一说到单例模式的概念,我们首先会想到下面的这种的写法 public class SingleInstance { private static SingleInstance singleInstance; /** * 单例模式 * @return */ public static SingleInstance getSingleI

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明