java 线程同步模拟银行_以银行取钱为例模拟Java多线程同步问题完整代码

简单了解下在操作系统中进程和线程的区别:

进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

多进程是指操作系统能同时运行多个任务(程序)。

多线程是指在同一程序中有多个顺序流在执行。首先存钱取钱的这个操作,应该是线程操作的,可以有很多的顾客,这意思就是得有多个线程,多个线程之间共同操作一个银行,银行的金额就需要同步。才能保证线程安全。

所以,下面就把这个代码的实例放这,有不对的地方,还请指出来哈。因为有个老铁问这个多线程的代码。

首先是银行,这个对象model的创建。

在代码里面有存和取2个方法,这2个方法,以及一个总金额,里面有部分被注释掉的代码,那个是简单易懂好理解的,多线程加锁互斥,保证线程间同步的方法。

但是这个是不常用的方法,常用的就是使用synchronized这个关键字来修饰同步方法。

客户对象的model

客户对象,因为可以很多个客户同时访问一个银行,所以,这个存钱取钱的操作就用线程来实现。

属性就构造方法传值了。

main方法

上述代码实际运行效果如下图。

bf3a1ab4eb54e65803fd0e0ef079b558.png

这个存取钱的次数要是小了,就可能会看到2个线程有先后顺序,所以,这个次数咱整多点,然后,就看到如图所示的情况,线程1是取钱的,线程0时存钱的,可以看到2个线程是互相交错执行的,有存有取,没有规律可言。

这个就保证了数据的同步了。

至于如何才能不同步,也就是异常的现象,

你可以把add方法的这个synchronized关键字去掉之后,把次数调小一点改成3次,sum的初始值给设置成0.你再试试代码,

就会发现所谓的不同步现象。

e62af16616ac6e137b73850aee5c7363.png

上图的右边就是不同步的结果,2个人每次存100,存三次,总数是不是得,100,200,300,400,500,600.得长。

但是,运行结果却不是的,

这个时候,你再把synchronized给add方法加上去,就会出现左边的图的结果,这个就是正确的结果。

我是为了,有存有取,所以,就又加了个方法。代码就变成上面的样子啦。

差不多都是线程间同步的例子啦。

我就简单记录下代码。用的时候,可以分分钟就拿出来。

总结

以上就是本文关于以银行取钱为例模拟Java多线程同步问题完整代码的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/qq_27093465/article/details/78637759

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值