java - Cloneable 的 super.clone() 是线程安全的方法吗?

标签 java multithreading

如果我有一个类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 中使用,并且处理程序被传递给两个线程 AB 如果同时线程 A 尝试,则会发生什么克隆处理程序和线程 B 尝试更改处理程序的公共(public)变量?
例如。

Foo Class
    s = "Hello"
    n = "42"

此类被传递给同时运行的 AB
A 想要克隆 Foo Class,1 µs 后 B 想要将 n 更改为 43
克隆结果将是 s = "Hello"和 n = "42"|| n =“43”
更简单:super.clone() 是线程安全的还是我必须使用locksynchronized?如果我必须使用 locksynchronized 哪个是使用它们的最佳方式?

最佳答案

您稍微误用了术语“线程安全”。它并不意味着“同步”,这显然就是您使用它的方式。再多的同步也无法防止实现错误破坏线程安全。例如,您编写的任何在不持有任何锁的情况下改变对象的代码都将明显违反对象的线程安全性,并且像 Object.clone 这样的库方法对此无能为力。

最终,线程安全始终掌握在实现者手中,Object.clone() 不会做任何让您变得更困难的事情:它所做的只是读取当前对象的状态并将其复制到新对象。它不会发布该新对象。

关于java - Cloneable 的 super.clone() 是线程安全的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440503/

相关文章:

java - JTree 上的自定义图标

java - 有没有办法压缩 Java Try Catch block ?

java - Spring Boot 服务在本地工作但不在远程

java - OkHttp 如何在不使用线程的情况下使用看似同步的 HTTP 连接执行并行 HTTP 请求?

Python 切片数组以进行多线程并按顺序重新组装结果?

Java接口(interface)问题

java - 从 rfcomm0 读取数据

java - run() 方法的同步

java - 安卓/Java : Is there a way to call the return of the method after a listener triggered?

带线程的 Python 程序无法捕获 CTRL+C