java线程数据同步_实例说明多线程数据同步存在的问题

观察输出结果,发现程序输出有些问题,少了一个作者的创作内容,多次运行程序,发现缺少哪个作者并没有规律。这显然不符合程序要求,检查程序也没有发现其它问题。这个隐藏的问题就是多线程数据同步的问题,多个作者线程试图同时更新图书对象内容,导致部分作者创作内容丢失。

问题应该出在Author线程类编辑内容和添加内容的代码上,编辑内容和添加内容的代码如下:

假设有A、B两个Author线程,A 线程先于B线程执行了docBook.getContent()语句,该语句执行完成后,A线程获取了当前图书内容,当A线程要执行docBook.setContent(str)语句时,A线程的运行被中断了(JVM分配给它的时间片用完了)。这时,假设B线程被执行,并且顺利完成了docBook.getContent()和docBook.setContent(str)语句,B线程编辑的内容已经存储到Book对象中。当A线程再次被执行时,A线程的docBook.setContent(str)语句将重写Book对象的内容,因为A线程已经在B线程之前获取了Book对象的内容,将会导致B线程写入到Book对象的内容被覆盖掉。

要解决Book对象同步的问题,就需要用到Java提供的线程同步方法,下面一节我们将介绍利用synchronized方法解决本节案例遇到的问题。

知识点拨

在多线程应用程序中,如果多个线程对共享数据仅是使用,则无需对共享数据做同步保护。当线程要对共享数据进行修改时,必须要对修改的共享数据进行同步保护,否则会出现莫名其妙的问题,程序出现的BUG也不好定位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值