Android Same实例输出不同的结果

时间:2016-03-09 00:27:45

标签: java android

我同时输出了同一个物体,但结果不一样...... 可能导致不同结果的原因是什么?

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;
  }
}

2 个答案:

答案 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静态...