一忠售,自旋鎖
1,nonatomic 非原子性,getter setter 方法都不加鎖迄沫,多個(gè)線程都可以訪問稻扬;
2,atomic 原子性,內(nèi)部有一把鎖羊瘩,鎖的是賦值的setter方法,讀取操作沒有上鎖泰佳,叫做自旋鎖。
@property(atomic,strong) NSObject *obj;
//生成屬性對應(yīng)的成員變量
@synthesize obj = _obj;
//模擬原子屬性
- (void)setObj:(NSObject *)obj{
//加鎖
@synchronized(self) {
_obj = obj;
}
}
- (NSObject *)obj{
return _obj;
}
二尘吗,同步鎖又叫做互斥鎖
一個(gè)例子:賣火車票逝她,同時(shí)多個(gè)人通過網(wǎng)絡(luò)來購票,那么就會資源共享(假如還有5張火車票睬捶,此時(shí)同時(shí)有6個(gè)人來通過網(wǎng)絡(luò)買票黔宛,那么他們會發(fā)現(xiàn)剩余的票數(shù)是5張,他們同時(shí)來購買侧戴,就會造成每個(gè)人買票過后宁昭,剩余票數(shù)是5-1=4張跌宛,其實(shí)票數(shù)剩余為0酗宋,而且其中會有一人沒有買到票),那么就可以通過加鎖的方式來解決疆拘。
//賣票的方法
-(void)sellTicket{
while (YES) {
//模擬網(wǎng)絡(luò)卡
[NSThread sleepForTimeInterval:1];
//加鎖的語法蜕猫,括號內(nèi)為鎖的對象,每個(gè)對象內(nèi)都有一把鎖,默認(rèn)鎖是開著的
//同步鎖,互斥鎖
@synchronized(self){
//tickets是火車票的票數(shù)
if(self.tickets >0){//tickets在上面設(shè)置成了自旋鎖,但是任然不能夠代替同步鎖,因?yàn)樽孕i僅僅只是對賦值進(jìn)行同步鎖,而這里不僅僅是對賦值進(jìn)行,還有對票數(shù)的讀取操作.當(dāng)一個(gè)線程在執(zhí)行這個(gè)操作的時(shí)候,那么下一個(gè)來的線程,會不斷的判斷這把鎖里面的狀態(tài),到底開了沒有.而同步鎖不是的,下一個(gè)線程是安靜的等待,知道上一個(gè)線程執(zhí)行完
self.tickets = self.tickets - 1;
NSLog(@"%@ 余票 %d",[NSThread currentThread],self.tickets);
continue;
}
}
NSLog(@"沒有票啦");
break;
}
}