我同时输出了同一个物体,但结果不一样...... 可能导致不同结果的原因是什么?
UserHelper.class中的函数:
public void login(String phone, String password) {
UserModel.logInInBackground(phone, password, new LogInCallback<UserModel>() {
@Override
public void done(UserModel userModel, AVException e) {
if (null != userModel) {
if (userModel.getPosition() == UserModel.USER_BUYER) {
refresh();
DebugLog.e("fuck" + mUserStatus + UserInstance.getInstance().getUserStatus());
for (UserListener listener : listeners)
listener.OnUserLogin();
} else if (userModel.getPosition() == UserModel.USER_SELLER)
logout();
} else for (UserListener listener : listeners)
listener.HandleError(e.getCode());
}
}, UserModel.class);
public USER_STATUS getUserStatus() {
return mUserStatus;
}
UserInstance.class。
public class UserInstance {
public static UserHelper mInstance;
public static UserHelper getInstance() {
if (null == mInstance) mInstance = new UserHelper();
DebugLog.e(mInstance.toString());
return mInstance;
}
}
答案 0 :(得分:1)
首先,如果你认为UserHelper
类是单身,
为什么使用USER_STATUS
而非UserInstance.getInstance().getUserStatus()
来访问getUserStatus()
个实例?
其次,如果从不同的线程访问单例,您可能会获得UserHelper
的不同实例,因为您的实现不是线程安全的。
正确的实施方法是使用double locking pattern:
public class UserInstance {
public static UserHelper mInstance;
private static final ReentrantLock lock = new ReentrantLock();
public static UserHelper getInstance() {
if (null == mInstance){
lock.lock();
try{
if (null == mInstance){
mInstance = new UserHelper();
}
}
finally{
lock.unlock();
}
}
DebugLog.e(mInstance.toString());
return mInstance;
}
}
答案 1 :(得分:0)
最终,我得到相同的实例..
感谢Shlomi Uziei。我忘了使用双锁模式。我不应该使mInstance静态...