第一步创建银行账号
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输出:
本文通过一个银行账户存取款的例子介绍了单例模式的三种实现方式,并演示了如何确保线程安全。同时,文章对比了单例模式与非单例模式下账户操作的不同结果。
2676

被折叠的 条评论
为什么被折叠?



