首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程安全经典案例:银行取钱问题

银行取钱的基本流程基本上可以分为如下几个步骤。 (1)用户输入账户、密码,系统判断用户的账户、密码是否匹配。...(2)用户输入取款密码 (3)系统判断账户余额是否大于取款余额 (4)如果余额大于取款余额,则取钱成功;如果余额小于取款余额,则取钱失败。...,该线程类根据根据执行账户、取钱数量进行取钱操作,取钱的逻辑是当其余额不足时无法提取现金,当余额足够时系统吐出钞票,余额减少。...解决方案:   Java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法就是同步代码块。...; } } 控制台输出: 老张:取钱成功!吐出钞票:800.0 余额为:200.0 老王取钱失败!余额不足!

30330
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【java多线程】多线程并发同步问题及解决方法

    银行卡疯狂存钱,存完一次就看一下余额;同时用存折子不停地取钱,取一次钱就看一下余额; 具体代码实现如下: 先弄一个银行账户对象,封装了存取插钱的方法: 1 package com.test.threadDemo2...从上面的例子里就可以看出,银行卡存钱和存折取钱的过程中使用了 sleep() 方法,这只不过是小生模拟“系统卡顿”现象:银行卡存钱之后,还没来得及查余额,存折就在取钱,刚取完钱,银行卡这边“卡顿”又好了...,查询一下余额,发现钱存的数量不对!...因此多个线程一起访问共享的数据的时候,就会可能出现数据不同步的问题,本来一个存钱的时候不允许别人打断我(当然实际中可以存在刚存就被取了,有交易记录在,无论怎么动这个帐号,都是自己的银行卡和存折在动钱。...1package com.test.threadDemo2; 2 3import java.util.concurrent.locks.ReentrantLock; 4/** 5 * 银行账户

    1.6K80

    设计模式之外观模式-总结

    来源:凯哥Java(kaigejava).本文由凯哥《23设计模》系列中的一篇。 凯哥突然感觉,使用家庭影院这个例子不恰当。换个通俗易懂的。去银行存取钱。这个案例大家都遇到过吧。...存取钱用户相对于银行系统来说,是外部人员(系统),窗口服务员就是银行对外提供得一个交互窗口。...我们把需要得身份证、银行卡、密码输入之后,窗口服务员就会给我们打印收据、取钱、请领导签字(如果取钱额度较大得话)等等操作,窗口服务员都帮我们处理完了。...最后,我们返回给我们得是我们需要取得现金或者存得凭证。...应用实例: 如果家庭影院以及银行取钱例子还不好理解。那么最简单的,JAVA中三层开发模式(MVC)就是典型的外观模式。这下是不是就好理解了.

    42730

    java多线程—Java 多线程同步的五种方法

    举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?...取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。...代码修改如下: package threadTest; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock...存进:100 账户余额:300 看了运行效果,一开始一头雾水,怎么只让存,不让取啊?...现在明白了吧,原来每个线程运行的都是一个副本,也就是说存钱和取钱是两个账户,知识名字相同而已。所以就会发生上面的效果。

    71710

    (删)Java线程同步实现一:synchronzied和wait()notify()

    上面文章(2.Java多线程总结系列:Java的线程控制实现)讲到了如何对线程进行控制,其中有一个是线程同步问题。...下面我们先来看一个例子: 1、一个典型的Java线程安全例子 package com.chanshuyi.thread; public class ThreadDemo93 { public...double balance){ this.balance = balance; } private double balance; } 上面例子很容易理解,有一张银行卡...,里面有2300的余额,程序模拟两个人进行操作,一个人存10次钱每次存200共存2000,一个人取钱取10次每次取100共取1000,这样的话最后的余额应该是3300。...经过分析,问题在于Java多线程环境下的执行的不确定性。在存取款的时候,我们应该保证同一账户下不能同时进行存钱和取款操作,否则就会出现数据的混乱。

    77340

    Java 多线程同步的五种方法

    举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?...取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。 三、不同步时的代码 Bank.java ? ?...它的原理是每次要线程要访问volatile修饰的变量时都是从内存中读取,而不是存缓存当中读取,因此每个线程访问到的变量值都是一样的。这样就保证了同步。...看了运行效果,一开始一头雾水,怎么只让存,不让取啊?...现在明白了吧,原来每个线程运行的都是一个副本,也就是说存钱和取钱是两个账户,知识名字相同而已。所以就会发生上面的效果。

    1.2K20

    攻击者利用7号信令(SS7)中的漏洞从德国银行偷取钱财

    回到现在,安全专家观察发现,一场利用SS7协议中的设计漏洞来窃取银行账户的大规模黑客活动正在进行中。多个来源证实黑客在过去几个月中一直在利用这种技术部署攻击活动。...据悉,黑客使用SS7协议中的漏洞利用双因素认证过程来拦截银行业务向客户发送的认证码。 黑客利用了德国银行使用的交易认证号码的双因素认证系统。...攻击者首先进行了垃圾邮件活动,在银行客户PC上提供恶意软件来收集用户的财务信息,包括银行帐户余额、登录凭据以及手机号码等。...到了晚上,攻击者就会登录受害者的银行账户窃取钱财,利用SS7漏洞访问帐户并授权欺诈性交易。 这是第一次公开证实的,利用SS7协议中的设计缺陷在欧洲进行的攻击行为。 有没有合适的解决方案?

    2.5K70

    3-多线程安全问题,线程同步

    线程安全问题 指的是多个线程操作同一个共享资源的时候可能会出现的线程安全问题 银行取钱问题 多个用户同时操作一个银行账户进行取钱操作,账户内余额为1000元,每个账户同时取出1000元,由于线程执行的随机性就会导致线程安全问题的产生...银行账户类 定义账户内容,定义取钱方法 package ThreadSafety; //定义账户类 public class Account { private int cardID;...acc = new Account(111, 1000); //创建多个线程去银行账户中取钱(多个线程操作一个资源) Thread user1 = new DrawThread...同步方法的底层也是有锁对象的: 在实例方法中默认使用this作为锁对象 在静态方法中默认使用类名.class字节码作为锁对象 Lock显式锁 java.util.current.locks.lock机制提供了比...; import java.util.concurrent.locks.ReentrantLock; //定义账户类 public class Account { private int cardID

    32620

    不烧钱,钱存银行 和创科技持续定增背后的野心?

    2 和创不烧钱 钱存在银行 为何还要一轮又一轮定增?...不差钱的和创却经历了上市前后的二轮定增,市值也一跃来到了42亿,按理说不缺钱的和创无需为钱发愁,在 2月25日举行的“2016企业级移动应用产业论坛”时和创董事长李汉生表示,和创科技是移动互联网领域内极少数不烧钱的公司,钱存在银行里...即然和创不缺钱也不差钱把钱存在银行里为什么还要一轮又一轮的定增呢?定增的目的和意义何在?...以上资金使用有时间周期,按计划投放,所以资金中的一部分放在银行中。 第三、与salesforce等国外400亿美金市值公司相比,其融资和存在银行里的资金,我们要差距太大。

    65180

    (删)Java线程同步实现二:Lock锁和Condition

    在上篇文章(3.Java多线程总结系列:Java的线程同步实现)中,我们介绍了用synchronized关键字实现线程同步。但在Java中还有一种方式可以实现线程同步,那就是Lock锁。...account){ this.account = account; } @Override public void run() { //每次存200...,取出钱:100.0 第7次,取钱后账户余额:2600.0 第8次,取出钱:100.0 第8次,取钱后账户余额:2500.0 第9次,取出钱:100.0 第9次,取钱后账户余额:2400.0 ***第6...; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 银行存取款...存款线程1因此获得了对象锁,并成功存进200,并唤醒了所有取款线程。此时取款线程1苏醒过来并判断账户余额满足了取款需求,于是取款线程1进行取款操作。

    99250

    图解ConcurrentHashMap

    举个生活中的例子,很多银行除了存取钱,还支持存取贵重物品,贵重物品都放在保险箱里,把 HashMap 和 HashTable 比作银行,结构: ?...接下来的情况是这样的:比如盖伦和亚索一起去银行存他们的大宝剑,这个「银行者联盟」一顿操作,然后对盖伦说,1号银行现在没人,你可以去那存,不用排队,然后盖伦就去1号银行存他的大宝剑,1号银行把盖伦接进门,...马上拉闸,一顿操作,然后把盖伦的大宝剑放在第x行第x个保险箱,等盖伦办妥离开后,再开闸;同样「银行者联盟」对亚索说,2号银行现在没人,你可以去那存,不用排队,然后亚索去2号银行存他的大宝剑,2号银行把亚索接进门...因此「银行者联盟」需要时刻保持清醒的头脑,对自己的银行空闲情况了如指掌,每次给用户推荐都应该是最好的选择。 3.「银行者联盟」怎么保证同一时间不会有两个人在同一个银行拥有存权限?...通过对指定银行加锁/解锁的方式实现。 2 源码分析 Java7 源码分析 通过 Java7 的源码分析下代码实现,先看下一些重要的成员 ? 上面这些一下出来有点接受不了没关系,下面都会介绍到。

    76321
    领券