只有写(setter方法)是加了锁的,读(get方法)没有加锁。 因此若是代码块中有读和写的两个操做不能保证数据的正确性
@property(atomic,assign) int ticketsCount;安全
//模拟卖票的方法 -(void) sellTickets{ while (YES) { [NSThread sleepForTimeInterval:1.0]; //判断是否还有票atom
//任意一个对象都有一把锁 //虽然ticketsCount是原子性的 可是因为代码里面同时有getter方法和setter方法因此没法保证数据正确。下面的代码不是线程安全的 if(self.ticketsCount>0){ self.ticketsCount=self.ticketsCount-1; NSLog(@"剩余%d张票",self.ticketsCount); }else{ NSLog(@"来晚了,票没了"); break; } }
}线程