java多线程执行的混乱

在现实生活中有很多问题涉及到了多线程,可以说多线程与我们的生活息息相关

 

这里说几个很典型也是很多程序员包括书本所引用的例子:①火车站卖票问题  ②缓冲区缓冲问题 ③生产者消费者问题

 

这样的问题没有线程根本没有办法解决,但如果解决不好又会遇到很多混乱,下面请看代码。

 

 

火车站售票问题

 

这是一个很典型的火车站售票问题,由于不只有一个售票点,但是票数是有限的,也许有一个售票点正在售票的时候得到了总票数,而另一个点却刚好完成售票操作,那么这个售票点的票数就是有错误的,所以运行上面的代码会发现有的时候执行会发生最终票数为负数的情况。这是一个需要在多线程中解决的问题。

 

再看一个银行账户存款取款的问题

 

 

 

我们执行完这个代码之后发现有很多的错误出现,比如说

 

wang账户:现有300.0取走300.0余额0.0

wang账户:现有0.0存入100.0余额0.0

wang账户:现有100.0存入200.0余额0.0

 

 

现在会发现出现了典型的数据不一致问题,由于在线程中运行时加入了线程睡眠,所以程序不管是开始运行还是运行结束都是未知的,所以我们的结果也是未知的。很有可能在线程执行的额时候发生了意外,导致了读脏数据。

 

 

这些是典型的数据不一致导致了线程执行时发生意外

 

再看一个的缓冲区问题,假设现在有一个缓冲区装置容量为1,有写入和写出操作两个线程,没次操作都只涉及到一个变量。

我们一般写的话就会出现下面这样的代码。

 

 

 

而现在得到的结果是这样的

存入:0

存入:1

存入:2

存入:3

存入:4

取出:4

取出:4

取出:4

取出:4

取出:4

显然我们存进去的值并不是每一个都被取出来了,前面的数据都被覆盖了,那么有没有办法能存一个取一个呢?能不能保证这些存入和取出操作正常的运行呢?

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值