只有寫(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; } }
}線程