Ios 如何在“init”中初始化线程安全变量?
我有以下代码:Ios 如何在“init”中初始化线程安全变量?,ios,objective-c,multithreading,synchronization,thread-safety,Ios,Objective C,Multithreading,Synchronization,Thread Safety,我有以下代码: { NSObject *_object; } - (instancetype)init { if (self = [super init]) { _object = [[NSObject alloc] init]; } return self; } - (NSObject*)object { return _object; } 如果在init完成并返回后,从第二个线程调用方法object,我如何知道init中对\u
{
NSObject *_object;
}
- (instancetype)init {
if (self = [super init]) {
_object = [[NSObject alloc] init];
}
return self;
}
- (NSObject*)object {
return _object;
}
如果在init
完成并返回后,从第二个线程调用方法object
,我如何知道init
中对\u object
的赋值将是可见的,并且实际上不会返回未赋值指针
什么是保证这一点的内部机制?代码的线程安全性取决于它的使用方式,而它的使用方式本质上是线程安全的。您不应该传递部分构造的对象,因此分配和初始化(
[[…alloc]init]
或new
)应该限制在单个线程中,然后传递给其他线程。代码的线程安全性取决于它的使用方式,它的使用方式本质上是线程安全的。您不应该传递部分构造的对象,因此分配和初始化([[…alloc]init]
或new
)应该限制在一个线程中,然后传递给其他线程。使用调度一次
。无论有多少线程,都保证只运行一次。比如说
+ (MyClass *)sharedInstance
{
// Static local predicate must be initialized to 0
static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyClass alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
使用
dispatch\u一次
。无论有多少线程,都保证只运行一次。比如说
+ (MyClass *)sharedInstance
{
// Static local predicate must be initialized to 0
static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
sharedInstance = [[MyClass alloc] init];
// Do any other initialisation stuff here
});
return sharedInstance;
}
我不关心数组的内容。那是另一个问题。我的问题是关于
init
中\u数组
赋值的可见性。如果我在线程A中调用init
,并在线程B中调用该方法,该方法是否保证在\u array
中看到nil
。我指的不是内容,而是在init
中初始创建的数组。我的意思是,在init
方法中不需要锁定机制。它是如何部分构造的<代码>[NSMutableArray]创建并返回空数组。这就是我要检索的对象。我的意思是,即使在init
完成并返回之后,它如何保证对\u array
的赋值对所有其他线程都立即可见,除非init
之后存在内存障碍?它不是部分构造的,我想说的是,使用类的代码应该调用alloc/init
或new
来完全构造对象,此时由于线程限制,代码是线程安全的。我不关心数组的内容。那是另一个问题。我的问题是关于init
中\u数组
赋值的可见性。如果我在线程A中调用init
,并在线程B中调用该方法,该方法是否保证在\u array
中看到nil
。我指的不是内容,而是在init
中初始创建的数组。我的意思是,在init
方法中不需要锁定机制。它是如何部分构造的<代码>[NSMutableArray]创建并返回空数组。这就是我要检索的对象。我的意思是,即使在init
完成并返回之后,它如何保证对\u array
的赋值对所有其他线程都立即可见,除非init
之后存在内存障碍?它不是部分构造的,我想说的是,使用类的代码应该调用alloc/init
或new
来完全构造对象,此时由于线程限制,代码是线程安全的。