dispatch_once主要是根據onceToken的值來決定怎么去執行代碼。
1.當onceToken= 0時,線程執行dispatch_once的block中代碼
2.當onceToken= -1時,線程跳過dispatch_once的block中代碼不執行
3.當onceToken為其他值時,線程被阻塞,等待onceToken值改變
當線程調用shareInstance,此時onceToken= 0,調用block中的代碼,此時onceToken的值變為140734537148864。當其他線程再調用shareInstance方法時,onceToken的值已經是140734537148864了,線程阻塞。當block線程執行完block之后,onceToken變為-1.其他線程不再阻塞,跳過block。下次再調用shareInstance時,block已經為-1.直接跳過block。
dispatch_once設計挺巧妙的。