Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java竞争条件下最糟糕的情况是什么?_Java_Multithreading_Race Condition_Atomicity - Fatal编程技术网

java竞争条件下最糟糕的情况是什么?

java竞争条件下最糟糕的情况是什么?,java,multithreading,race-condition,atomicity,Java,Multithreading,Race Condition,Atomicity,我知道这显然是一种比赛状态。但是可能发生的事情是什么呢 class Blah { List<String> stuff; public List<String> getStuff() { return stuff } public void setStuff(List<String> newValue) { this.stuff = newValue } } b = new Blah()

我知道这显然是一种比赛状态。但是可能发生的事情是什么呢

class Blah {
    List<String> stuff;
    public List<String> getStuff() {
        return stuff
    }
    public void setStuff(List<String> newValue) {
        this.stuff = newValue
    }
}

b = new Blah();
// Thread one
b.setStuff(getListFromSomeNetworkResource());
for (String c : b.getStuff()) {
  // Work with c
}


// Thread two
b.setStuff(getListFromSomeNetworkResource());
for (String c : b.getStuff()) {
  // Work with c
}
class废话{
列出材料;
公共列表getStuff(){
退货
}
公共无效设置凝灰岩(列出新值){
this.stuff=newValue
}
}
b=新的废话();
//一号线
b、 setStuff(getListFromSomeNetworkResource());
for(字符串c:b.getStuff()){
//与c一起工作
}
//线二
b、 setStuff(getListFromSomeNetworkResource());
for(字符串c:b.getStuff()){
//与c一起工作
}
  • 这会引发RuntimeException吗
  • 这会导致jvm故障吗
  • 这根线能断开一根吗
  • 它依赖于处理器吗。如果是英特尔至强处理器呢
  • 这会引发NullPointer异常吗
  • 如果函数实际返回不同的值,线程2可以读取线程1设置的内容,反之亦然
  • 我理解这是一种竞争条件,不会编写这样的代码。但我如何说服其他人不要这样做呢

    更新:

    假设:

  • getListFromSomeNetworkResource()
    始终返回新的
    ArrayList
    。大小可以是0或更多
  • getListFromSomeNetworkResource()
    是线程安全的
  • 这会引发RuntimeException吗

    否,如果
    getListFromSomeNetworkResource()
    是线程安全的并且不返回
    null

    这会导致jvm故障吗

    这根线能断开一根吗

    它依赖于处理器吗。如果是英特尔至强处理器呢

    没有

    这会引发NullPointer异常吗

    仅当
    getListFromSomeNetworkResource()
    可以返回
    null

    如果函数实际返回不同的值,线程2可以读取线程1设置的内容,反之亦然


    是的,这种情况很可能会发生。

    危险在于命令,例如:

  • 线程一:
    b.setStuff(getListFromSomeNetworkResource())
  • 线程二:
    b.setStuff(getListFromSomeNetworkResource())
  • 线程一:
    b.stuff.iterator()
    (通过for循环开头的
    b.getStuff()
  • 在这种情况下,线程1可能正在遍历线程2设置的列表。从线程2到线程1的发布是在没有任何同步的情况下完成的——这是一场数据竞赛。假设列表本身不是线程安全的,那么很多事情都可能发生。主要的问题是,由于数据竞争,列表的某些状态对线程1可见,但不是全部

    • 它可能会抛出一些RuntimeException。例如,可能有一个字段认为由于调整了大小,列表中有
      n
      元素。但是来自调整大小的新数组没有完成,因此最终会出现ArrayIndexOutOfBoundsException
    • 它可能出于多种原因引发NullPointerException;可能是一个链表,其中一个引用写入没有到达线程1
    它不应该导致任何错误:这些错误只能来自JVM中的错误,而不会来自代码中的错误


    这可能取决于处理器,因为处理器可能有不同的处理方式,比如将内存从一个CPU缓存刷新到另一个CPU缓存——这就是不安全发布可能导致您只能看到一个线程从另一个线程写入的部分数据的原因之一。有很多方法可以强制这些缓存被刷新;在Java中指定它们的方法是通过各种数据同步机制(获取锁、使用易失性字段等)。

    >线程一可能正在遍历线程二设置的列表,这真的可能吗?迭代器不是对象的本地对象吗?两个线程都有不同的对象?但是,两个线程共享相同的
    b
    实例,因此都可以共享相同的
    b.stuff
    引用。迭代器确实是线程本地的,但其支持列表不是。在我上面的例子中,按照我的步骤顺序,想想第三步中引用了哪个对象
    b.stuff
    。噢,一个半月后的一次驾车向下投票。这是新的。:-)有机会发表评论解释吗?选民们,请发表评论