use dispatch_once instead of @synchronized