夫妻银行卡取钱之初识单例模式

本文通过一个银行账户存取款的例子介绍了单例模式的三种实现方式,并演示了如何确保线程安全。同时,文章对比了单例模式与非单例模式下账户操作的不同结果。

第一步创建银行账号

public class BankAccount {

//配合单例模式1,2
//private  static BankAccount mAccount;
//配合单例模式3
private  static BankAccount mAccount=new BankAccount();

//卡里钱数
int mNumber=Const.NOW_MONEY;
//私有构造方法
private BankAccount(){

}

/**
 *  单例模式1--线程不安全
 * @return
 */

// public static BankAccount getInstance(){
// mAccount=new BankAccount();
// return mAccount;
// }
/**
* 单例模式2:同步静态方法–线程安全 synchronized造成不必要的开销
* @return
*/
// public static synchronized BankAccount getInstance(){
// if (mAccount==null) {
// mAccount = new BankAccount();
// }
// return mAccount;
// }
/**
* 单例模式3:静态初始化–线程安全 推荐
* @return
*/
public static BankAccount getInstance(){

    return mAccount;
}

//银行可以被存取钱
public boolean handlerBankMoney(int num){
    if (mNumber+num>0){
        mNumber+=num;
        return true;
    }else {
        return false;
    }
}

}

第二步:常量类确定银行钱数

public class Const {
//取之前的钱数
public static final int NOW_MONEY=50000;
}

第三步:创建person类并person取钱方法

public class Person {

BankAccount mBankAccount;

//person具有存取钱的能力
public boolean handlerMoney(int num){
        //非单例模式
       //mBankAccount=new BankAccount();
        //单例模式下
        mBankAccount=BankAccount.getInstance();
        return mBankAccount.handlerBankMoney(num);

}

}

第四步:在MainActivity中开启线程同步取钱(布局文件略)

public class MainActivity extends AppCompatActivity {

TextView mMoneyNum;
TextView mMyOutNum;
TextView mWifeOutNum;

int mAccountMoneyNum=Const.NOW_MONEY;

private static final int OUT_MONEY=-30000;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mMoneyNum= (TextView) findViewById(R.id.my_money);
    mMyOutNum= (TextView) findViewById(R.id.me_out_money);
    mWifeOutNum= (TextView) findViewById(R.id.wife_out_money);

    mMoneyNum.setText(mAccountMoneyNum+"");
    mMyOutNum.setText("0000");
    mWifeOutNum.setText("0000");

    Person me=new Person();
    Person myWife=new Person();

    myWifeHandlerOutMoney(myWife,OUT_MONEY);
    meHandlerOutMoney(me,OUT_MONEY);

}

private void myWifeHandlerOutMoney(final Person myWife, final int num) {
    new Thread(new Runnable() {
        @Override
        public void run() {

            Log.i("main9","myWife来取钱了");
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            final boolean myWifeOkOrNot= myWife.handlerMoney(num);
            Log.i("main9","myWife取钱成功"+myWifeOkOrNot);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (myWifeOkOrNot){
                        mAccountMoneyNum+=num;
                        mMoneyNum.setText(mAccountMoneyNum+"");
                        mWifeOutNum.setText(Math.abs(num)+"");
                    }else {
                        Toast.makeText(MainActivity.this, "啊啊啊啊啊啊啊啊啊,老婆没取到钱...", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    }).start();

}

private void meHandlerOutMoney(final Person me, final int num) {
    new Thread(new Runnable() {
        @Override
        public void run() {

            Log.i("main9","me来取钱了");
            final boolean meOkOrNot= me.handlerMoney(num);
            Log.i("main9","me取钱成功"+meOkOrNot);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (meOkOrNot){
                        mAccountMoneyNum+=num;
                        mMoneyNum.setText(mAccountMoneyNum+"");
                        mMyOutNum.setText(Math.abs(num)+"");
                    }else {

                        Toast.makeText(MainActivity.this, "啊,我没取到钱...", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    }).start();


}

}

非单例模式结果图以及logcat输出:
这里写图片描述

这里写图片描述

最后附上单例模式对比图以及logcat输出:

这里写图片描述

这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值