多线程存钱案例:

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的更多相关文章

  1. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  2. 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)

    还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...

  3. Java的多线程机制系列:(三)synchronized的同步原理

    synchronized关键字是JDK5之实现锁(包括互斥性和可见性)的唯一途径(volatile关键字能保证可见性,但不能保证互斥性,详细参见后文关于vloatile的详述章节),其在字节码上编译为 ...

  4. java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)

    前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...

  5. Java多线程分析案例

    1. 多线程的创建方式 (1).继承 Thread类:但Thread本质上也是实现了Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 sta ...

  6. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

  7. Java中多线程访问冲突的解决方式

    当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题. 第一种 同步方法 第二种 同步代 ...

  8. 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值

    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...

  9. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

随机推荐

  1. Unix和Windows文件格式转化

    可能的原因有: 1)执行权限的问题 解决方法: chmod +x ***.py 2)python版本的问题 解决方法:在执行时或者在py文件中选择好对应的Python的版本 3)python文件格式的 ...

  2. Configuration Reference In Vue CLI 3.0

    Configuration Reference This project is sponsored by  #Global CLI Config Some global configurations ...

  3. 开发apicloud模块遇到的几个梗

    2017-06-04 原来模块中不能的R.id.xxx,只能用UZResourcesIDFinder.getResIdID("mo_minivr_framecontainer") ...

  4. GC收集器种类

    转载:https://wangkang007.gitbooks.io/jvm/content/la_ji_shou_ji_qi.html 收集器 1.1 Serial(串行)收集器 Serial收集器 ...

  5. windows 10 开发学习资料,Windows-universal-samples学习笔记系列一:App settings

    windows 10 通用代码范例: https://github.com/Microsoft/Windows-universal-samples 相关视频:https://mix.office.co ...

  6. Linux mount命令

    mount 1.作用 mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者. 2.格式 mount -a [-fv] [-t vfstype] [-n] [-r ...

  7. Apache Prefork、Worker和Event三种MPM分析

    三种MPM介绍 Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到 ...

  8. JS高级- OOP-ES5

    1. OOP 面向对象三大特点: 封装,继承,多态 封装: 问题: 构造函数可重用代码和结构定义,但无法节约内存 为什么: 放在构造函数内的方法定义,每new一次,都会反复创建副本——浪费内存 解决: ...

  9. input.file样式修改

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Django的学习(四)———— admin

    admin是django自带的一个管理者,由于自带所以直接对admin文件进行一个配置. 一.创建用户: python manage.py createsuperuser 创建合理的用户信息就可以在网 ...