use dispatch once replace synchronized