Android-Java-解决(多线程存钱案例)的安全隐患-synchronized
多线程存钱案例:
package android.java.thread10; /**
* 两个储户,到同一个银行存钱,每个人存了3次,一次1000000.00元
* 1.描述银行
* 2.描述储户任务
* 3.分析这个多线程是否存在安全隐患
*/ /**
* 1.描述银行
*/
class Bank { private double moneyAsset; public void addMoney(double moneyAsset) {
this.moneyAsset += moneyAsset;
System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元");
} } /**
* 2.描述储户任务
*/
class Customer implements Runnable { private Bank bank = new Bank(); @Override
public void run() {
for (int i = 0; i < 3; i++) {
bank.addMoney(1000000.00);
}
}
} public class BankTest { public static void main(String[] args) {
// 定义执行的任务
Runnable customer = new Customer(); // 线程执行>>>定义执行的任务
new Thread(customer).start();
new Thread(customer).start();
} }
执行结果,每次结果不同是由于CPU随机执行某个线程造成的

但是出现这种情况,就是出现了安全问题,Thread-1存入2000000.0元,Thread-0存入2000000.0元:
Thread-1存入2000000.0元
Thread-0存入2000000.0元
Thread-1存入3000000.0元
Thread-0存入4000000.0元
Thread-1存入5000000.0元
Thread-0存入6000000.0元
对于为什么会出现安全问题,可以看Android-多线程安全问题-synchronized,博客
解决安全问题,找到此程序 多线程执行共享数据/变化共享数据的代码,然后用synchronized{}
package android.java.thread10; /**
* 两个储户,到同一个银行存钱,每个人存了3次,一次1000000.00元
* 1.描述银行
* 2.描述储户任务
* 3.分析这个多线程是否存在安全隐患
*/ /**
* 1.描述银行
*/
class Bank { /**
* 3.分析这个多线程是否存在安全隐患 这里就是多线程执行的共享对象的共享数据
*/
private double moneyAsset; public void addMoney(double moneyAsset) { /**
* 多线程执行共享数据/变化共享数据的代码,然后用synchronized{}
*/
synchronized (Bank.class) { // 只持有一把锁Bank.class
this.moneyAsset += moneyAsset;
System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元");
}
} } /**
* 2.描述储户任务
*/
class Customer implements Runnable { /**
* 3.分析这个多线程是否存在安全隐患 这里就是多线程执行的共享对象
*/
private Bank bank = new Bank(); @Override
public void run() {
for (int i = 0; i < 3; i++) {
bank.addMoney(1000000.00);
}
}
} public class BankTest { public static void main(String[] args) {
// 定义执行的任务
Runnable customer = new Customer(); // 线程执行>>>定义执行的任务
new Thread(customer).start();
new Thread(customer).start();
} }
执行结果:

Android-Java-解决(多线程存钱案例)的安全隐患-synchronized的更多相关文章
- java基础-多线程应用案例展示
java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...
- 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)
还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...
- Java的多线程机制系列:(三)synchronized的同步原理
synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...
- java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)
前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...
- Java多线程分析案例
1. 多线程的创建方式 (1).继承 Thread类:但Thread本质上也是实现了Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 sta ...
- JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)
实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...
- Java中多线程访问冲突的解决方式
当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题. 第一种 同步方法 第二种 同步代 ...
- 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值
058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...
- 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
随机推荐
- match
//清空数据match (n) detach delete n (一)查询节点1.查询所有节点 //查询数据库中的所有节点 match(n)return n 2.查询带有某个标签的所有节点 //查询数 ...
- js模态框实现原理
<!DOCTYPE> <html> <head> <style>/* 定义模态对话框外面的覆盖层样式 */ #modal-overlay { visib ...
- unity luaFramework
1 AppConst: DebugMode: 调试模式,true:lua脚本直接读取自 AssetDir,false:开始会将AssetDir内的lua脚本复制到 Util.DataPath内(根据平 ...
- 【UI测试】--易用性
- OCIlib的几个函数的执行效率(附上pro*c的性能对比)
ocilib提供了以下几个执行sql语句的函数 OCI_ExecuteStmt/OCI_ExecuteStmtFmt 使用没有绑定变量的语句 OCI_Execute 使用有绑定变量的语句 OCI_Im ...
- Mysql #1406 Data too long 错误
Mysql #1406 Data too long 错误 http://blog.sina.com.cn/s/blog_68004f680100kgfh.html B. Mysql配置文件: “在 ...
- python学习 day08 (3月13日)----函数
函数 一.定义 def 关键字 函数名(): 函数体 函数 ---- 封装#def 关键字 # #定义后的函数就像变量 不调用是不执行的 # #函数名() ==函数的调用 def code(): ...
- Mac 更换桌面背景崩溃(闪退)
更新完系统后就会出现这种情况,,其实就是用户偏好文件出了问题. 1. 在终端输入 cd /Users/YourUserName/Library/Preferences //进入文件夹 rm com.a ...
- bundler简介(ruby gem)
簡介 Bundler RubyGem 是包裝.散佈Ruby程式庫的標準方式,相關文件可以參考 RubyGems Guides 的說明,或是 簡介 plugins 中的第二個例子.在使用rails ...
- 2019.01.02 poj3046 Ant Counting(生成函数+dp)
传送门 生成函数基础题. 题意:给出nnn个数以及它们的数量,求从所有数中选出i∣i∈[L,R]i|i\in[L,R]i∣i∈[L,R]个数来可能组成的集合的数量. 直接构造生成函数然后乘起来f(x) ...