gpt4 book ai didi

java - Java中线程安全类的解释

转载 作者:行者123 更新时间:2023-12-01 18:19:49 25 4
gpt4 key购买 nike

让我们考虑一下这种情况:

public class A {
private Vector<B> v = new Vector<B>();
}

public class B {
private HashSet<C> hs = new HashSet<C>();
}

public class C {
private String sameString;

public void setSameString(String s){
this.sameString = s;
}
}

我的问题是:

  1. Vector 是线程安全的,因此当线程调用它时,例如 get(int index) 方法,该线程是否是HashSeths

  2. 如果线程通过 v 调用 get(int index) 并且获得一个 B 对象。然后这个线程获取一个C对象并调用setSameString(String s)方法,这样写是线程安全的吗?或者需要Lock之类的机制?

最佳答案

首先看一下this SO关于使用Vector的原因。话虽这么说:

1) Vector 锁定每个操作。这意味着它一次只允许一个线程调用其任何操作(get、set、add 等)。没有什么可以阻止多个线程修改 B 或其成员,因为它们可以在不同时间获取对它们的引用。 Vector(或具有类似同步策略的类)的唯一保证是没有两个线程可以同时修改 vector ,从而进入竞争条件(这可能会抛出 ConcurrentModificationException和/或导致未定义的行为);

2) 如上所述,没有什么可以阻止多个线程同时访问 C,因为它们可以在不同时间获取对它们的引用。

如果需要保护对象的状态,则需要尽可能接近状态。 Java 没有线程拥有对象的概念。因此,在您的情况下,如果您想防止许多线程同时调用 setSameString,您需要声明方法 synchronized

我推荐优秀的book作者:Brian Goetz,关于并发性,了解有关该主题的更多信息。

关于java - Java中线程安全类的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933934/

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