supprot multi-thread use singleton client