如果我有一个类Foo
public class Foo implements Serializable, Cloneable {
public Foo() {}
protected String s;
protected int n;
public Foo clone() {
return (Foo) super.clone();
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public String getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
它在 MyClass
中使用,并且处理程序被传递给两个线程 A
和 B
如果同时线程 A 尝试,则会发生什么克隆处理程序和线程 B 尝试更改处理程序的公共(public)变量?
例如。
Foo Class
s = "Hello"
n = "42"
此类被传递给同时运行的 A
和 B
。
A
想要克隆 Foo Class
,1 µs 后 B
想要将 n 更改为 43
。
克隆结果将是 s = "Hello"和 n = "42"|| n =“43”
?
更简单:super.clone()
是线程安全的还是我必须使用lock
或synchronized
?如果我必须使用 lock
或 synchronized
哪个是使用它们的最佳方式?
最佳答案
您稍微误用了术语“线程安全”。它并不意味着“同步”,这显然就是您使用它的方式。再多的同步也无法防止实现错误破坏线程安全。例如,您编写的任何在不持有任何锁的情况下改变对象的代码都将明显违反对象的线程安全性,并且像 Object.clone
这样的库方法对此无能为力。
最终,线程安全始终掌握在实现者手中,Object.clone()
不会做任何让您变得更困难的事情:它所做的只是读取当前对象的状态并将其复制到新对象。它不会发布该新对象。
关于java - Cloneable 的 super.clone() 是线程安全的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440503/