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一起工作
}
getListFromSomeNetworkResource()
始终返回新的ArrayList
。大小可以是0或更多getListFromSomeNetworkResource()
是线程安全的getListFromSomeNetworkResource()
是线程安全的并且不返回null
这会导致jvm故障吗
这根线能断开一根吗
它依赖于处理器吗。如果是英特尔至强处理器呢
没有
这会引发NullPointer异常吗
仅当getListFromSomeNetworkResource()
可以返回null
如果函数实际返回不同的值,线程2可以读取线程1设置的内容,反之亦然
是的,这种情况很可能会发生。危险在于命令,例如:
b.setStuff(getListFromSomeNetworkResource())代码>
b.setStuff(getListFromSomeNetworkResource())代码>
b.stuff.iterator()
(通过for循环开头的b.getStuff()
)- 它可能会抛出一些RuntimeException。例如,可能有一个字段认为由于调整了大小,列表中有
元素。但是来自调整大小的新数组没有完成,因此最终会出现ArrayIndexOutOfBoundsExceptionn
- 它可能出于多种原因引发NullPointerException;可能是一个链表,其中一个引用写入没有到达线程1
这可能取决于处理器,因为处理器可能有不同的处理方式,比如将内存从一个CPU缓存刷新到另一个CPU缓存——这就是不安全发布可能导致您只能看到一个线程从另一个线程写入的部分数据的原因之一。有很多方法可以强制这些缓存被刷新;在Java中指定它们的方法是通过各种数据同步机制(获取锁、使用易失性字段等)。>线程一可能正在遍历线程二设置的列表,这真的可能吗?迭代器不是对象的本地对象吗?两个线程都有不同的对象?但是,两个线程共享相同的
b
实例,因此都可以共享相同的b.stuff
引用。迭代器确实是线程本地的,但其支持列表不是。在我上面的例子中,按照我的步骤顺序,想想第三步中引用了哪个对象b.stuff
。噢,一个半月后的一次驾车向下投票。这是新的。:-)有机会发表评论解释吗?选民们,请发表评论