多线程存钱案例:

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. Java Http协议处理类

    public class HttpRequest { public static String doGet(String url,String params) throws Exception{ re ...

  2. 第一次java实验报告

    实验一Java开发环境的熟悉-1 步骤: mkdir +20165213exp1创建20165213exp1这个目录 cd +20165213zqh进入这个目录 mkdir+src+bin创建目录sr ...

  3. maven项目springmvc导包失败-JsonProcessingException

    昨天搞了好久还是没有解决,今天把springaop小demo敲一遍时,启动tomcat时报错: org.springframework.beans.factory.BeanCreationExcept ...

  4. 【jquery+easyUI】-- $.messager.show 弹框显示

    三种基本弹框 1.提示框,一秒停留 $.messager.show({ title: '提示', msg: '修改成功!', showType: 'fade', //设置显示类型 style: { l ...

  5. 校园网ipv6连接问题

    没有ipv6的信号:只需要进入网络适配器里面先禁用再启用即可.

  6. 简单rmi示例

    User类          注意:需要实现序列化 package study.rmi.server; import java.io.Serializable; public class User i ...

  7. c#里如何实现讲一个字符串数组例如 “112,221”转化成两个字符串数组“112” “221” 中间以逗号隔开

    比如是S [0]="123,223" S[1]="111,222" ....... 想转化为 SX[0]="123" SX[1]=" ...

  8. 如何为终端用提供更快的解决方案?让IT技术员具备更高的效率?

  9. python学习 day22 (3月29日)----(生成器推导式)

    新手上路请多担待 1 2 封装 3 私有化封装 #__author : 'liuyang' #date : 2019/3/29 0029 上午 9:35 # 不想让别人看 修改 我的属性 # 源码来说 ...

  10. 核心一:DI

    1.DI:中文名称:依赖注入 2.英文名称:(Dependency Injection) 3.DI是什么?? 3.1 DI和IoC是一样的 3.2 当一个类(A)中需要依赖另一类(B)对象时,把B赋值 ...