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 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
随机推荐
- 语法分析器初步学习——LISP语法分析
语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...
- 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中
DIOCP Demo说明 下载地址 https://code.google.com/p/diocp/ 特地为DIOCP开设了一个群:320641073,欢迎学习的IOCP的童鞋进入讨论. 核心作者: ...
- csdn博客
https://blog.csdn.net/lydstory123?t=1 以前还有几篇文章 忘记了
- 专访UI中国认证设计师卤大湿 | 一位UI大师关于UI设计的思考
现如今,设计师可以说是一个自带光环的Title,很多深藏不漏的UI设计师们都在以自己的方式为产品设计做出贡献,卤大湿便是这其中之一. 精分青年卤大湿,这个在UI中国上是张酷酷的鲁迅头像的UI设计师,是 ...
- hehe,网易邮箱已经流氓到这个地步了
网易邮箱现在感觉作死,申请个邮箱还要下载你的APP,好,你牛逼,再见. 这是态度的问题. 最近丢了5亿的用户信息死不承认,撞库能把密保问题给撞出来? 如果真是撞库的话,丁三石养猪也已经感染口蹄疫了吧.
- regexper-正则表达式检验
https://regexper.com 例如:输入 \s.?\w{1,3}(\d(\W)(#?\d{1..4}))
- 《团队-爬取豆瓣电影TOP250-设计文档》
搭建环境: 1.安装python3.4 2.安装pycharm集成开发环境 3.安装Git for Windows 4.安装python第三方包 bs4开发阶段: 1.团队成员申请并配置github账 ...
- Java的GUI如何能够切换界面
在设计GUI的时候,会遇到类似于菜单栏的切换,如何做到界面切换 使用一个JTabbedPane组件,就可以实现界面的切换问题. 在使用的时候可以将里面要使用的组件进行一个封装,封装成一个Panel.再 ...
- windows下如何修改mysql的端口号
- 纯css实现蒙层loading效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...