填坑关于线程在构造函数里中断后是否会形成竞态条件,看《Java并发编程实战》的一个疑问

10人阅读 评论(0) 收藏 举报
分类:

在看《Java并发编程实战》一书的40页和41页时产生了一个疑问,作者说采用了不可变对象会使这个程序保持线程安全,但是我想了一下发现点问题。

源代码我就懒得打出来了,照两张相吧



现在假如有两个线程A和B,A线程先进行,当A线程访问到

cache = new OneValueCache(i, factors);

然后进入OneValueCache的构造函数,假如线程A在下面代码的第一句后中断了,像下面那样(故意插入一个sleep()让它中断)。

lastNumber = i;
Thread.sleep(1000);
lastFactors = Arrays.copyOf(factors, factors.length);

此时的成员变量cache已经被线程A更改成了一个半初始化的新变量(lastNumber已经被初始化值,但是lastFactors还没初始化,值为初始值null)<这句话是错的,下面分析>。

这时线程B获取cpu执行权,然后访问service()函数,当线程B访问到

BigInteger[] factors = cache.getFactors(i);

此时线程B访问了一个半初始化的成员变量cache,不会产生错误?

这个问题我想了很久,写了很多demo测试,最后发现是我想错了,线程B执行的是原来的cache,cache的值并没有被线程A修改,因为要等到构造函数彻底完成后才会返回this引用,成员变量cache才会更新,所以不用考虑构造函数里面赋值的原子性。

查看评论

Excel条件格式实战视频课程【你学得会】

在日常使用Excel中,我们经常需要对数据表中的文字或者数据进行相关条件的格式标识,这时我们就需要用到条件格式这个功能了。所谓条件格式是指当满足一定条件的时候,Excel自动显示单元格的指定格式。条件格式为辅助工具,方便显示重点内容,提高表格的可读性。 杨老师通过《Excel公式实战视频课程【你学得会】》的课程教你如何使用条件格式来把握内容的重点,突出显示需求内容,提高工作效率。
  • 2016年02月02日 15:41

多线程1:竞态条件

竞态条件(Race Condition):计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。 最常见的竞态条件为: 一,先检测后执行。执行依赖于检测的结果,而检测结果依赖于多个线程的执...
  • a19881029
  • a19881029
  • 2012-11-20 10:19:37
  • 8366

JAVA多线程(二)竞态条件、死锁及同步机制

本文介绍了JAVA多线程常出现的安全问题(竞态条件、死锁),并介绍了解决方法(例如同步机制等)...
  • antony9118
  • antony9118
  • 2016-05-23 13:30:02
  • 4260

java竞态条件与临界区

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件。 界区实现方法有两种,一种是用synchroni...
  • zhansong_1987
  • zhansong_1987
  • 2015-05-25 14:32:48
  • 748

Linux----并发与竞态

并发是指多个执行单元同时、并发被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问也很容易导致竞态。 即:同一时间多个“设备”同时访问同一个“区域”是会出错的。 但是在C...
  • smallfish_love
  • smallfish_love
  • 2016-02-27 11:42:10
  • 535

并发编程五:竞态条件与临界区

并发编程:竞态条件与临界区介绍当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竟态条件发生的代码称作临界区。备注:以下这段代码就存在竞态条件,其中return ++count...
  • nicewuranran
  • nicewuranran
  • 2016-08-14 14:59:49
  • 545

什么叫竞态条件?

竞态条件是由和事件时间相关的意料之外的依赖所导致的反常行为。换句话说,一个程序员不正确的假设一个特殊的事件总是在另一个事件之前发生。  一些通常的导致竞态条件的原因是信号,存取检查和打开文件操作。由于...
  • tanliyoung
  • tanliyoung
  • 2007-01-12 14:38:00
  • 1641

谈谈竞态条件

什么是竞态条件官方的定义是如果程序运行顺序的改变会影响最终结果,这就是一个竞态条件(race condition). 理解竞态条件首先要知道程序运行不一定是线性的。初学编程的时候都是从“面向过程编程“...
  • Clifnich
  • Clifnich
  • 2017-11-05 09:38:10
  • 1201

竞态条件(多线程)

可以想像一下,如果在一个线程正在创建的同时另一线程正在退出,那么会发生什么情况呢?如果线程调度器正巧在它们之间切换,程序会莫名其妙地关闭。线程 1 正在执行 i = i + 1; 这样的代码,线程 ...
  • u012138828
  • u012138828
  • 2014-09-14 22:35:54
  • 592

java并发线程安全,延迟初始化中的竞态条件。

现有线程A,B,对以下代码并发访问,获取实例。先来看一段代码:代码在以上代码中,理想是结果是线程A,B得到得到同一个实例对象,但是结果却并不绝对,有可能会得到2个不同的实例对象。在《java并发编程实...
  • qq_24489717
  • qq_24489717
  • 2017-03-11 00:27:44
  • 508
    个人资料
    持之以恒
    等级:
    访问量: 296
    积分: 115
    排名: 122万+
    文章分类
    文章存档