gpt4 book ai didi

java - 在java中使用方法限制的安全发布

转载 作者:行者123 更新时间:2023-12-03 12:56:44 25 4
gpt4 key购买 nike

考虑一个类的片段:

    // tail call to show
void showNextPoint(){
Point p = new Point();
p.x = 10;
p.y = 12;
show(p);
}

// multiple calls to show
void showPoints(){
Point p = new Point();
p.x = 10; p.y = 12;
show(p);
p.x = 20; p.y = 22;
show(p);
p.x = 30; p.y = 32;
show(p);
}

void show(Point p){
// use p in some way
// can p's state be changed safely ?
// can a new thread be started to work with p safely ?
}

在多线程用例中,对象可以 p被视为从 showPoints() 安全发布或 showNextPoint() ?什么条件必须在 show()中成立为了这 ?

show(Point p)保证 1) 不启动新线程和 2) 不改变 p 的状态, showPoints() 可以吗?方法被视为安全发布 p ?

最佳答案

show()方法获取对 Point p 的引用.如果调用者随后更改了 p ,它正在对同一个对象进行更改。如 show()变化 p无论如何,它都会更新相同的 p调用者正在使用的对象。如果 fork 了具有此 p 的线程那么你有一个关于更新到 p 的竞争条件是按什么顺序执行的。

Point p = new Point(1, 2);
show(p);
// p.x == 100 here

void show(Point p) {
p.x = 100;
}

你问:
void show(Point p){
// use p in some way
// can p's state be changed safely ?
// can a new thread be started to work with p safely ?
}

不能在不影响调用者对象的情况下安全地更改它,不。新线程也不能更改 p不会在内存同步发生时影响调用者的对象。

In a multithreaded use-case , can the object p be considered as published safely from the showPoints() or showNextPoint() ? What conditions must hold true in show() for this ?



这完全取决于您如何编写代码——契约是什么。如果一个方法改变了一个对象,那么它应该被记录下来。如果调用者不希望这样做,那么您应该传入 Point 的副本。方法可以“拥有”或方法本身应该复制的对象 Point本身。

将更改同步到对象的复杂性是许多 Java 对象不可变的原因之一。您可以考虑对 Point 这样做.做到这一点 xy值不能更改,这意味着 show方法及其产生的任何线程都可以安全地使用该参数,而不必担心调用者对其进行更改。

编辑:

If show(Point p) is guaranteed 1) not to start a new thread and 2) not to change p's state , can the showPoints() method be considered as safely publishing p ?



@JohnVint 对此有一些更好的观点,但我想我会添加我的想法。我不确定你在这里问什么,我不确定你认为“安全发布”意味着什么。细节决定成败。如 show()不启动新线程然后是的,您发布的代码将起作用并且可以使用相同的可变 Point目的。

任何采用对象参数但不以任何方式更改对象的方法都可以说它是“安全使用”(我猜)该对象。自 showPoints()构造对象并拥有对它的唯一引用,那么这当然也是安全的。是时候 p被修改,并且涉及另一个线程,一切都会改变。

关于java - 在java中使用方法限制的安全发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9601553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com