gpt4 book ai didi

Java Happens-Before 和线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:56 26 4
gpt4 key购买 nike

假设我有一个包装 HashMap 的类,如下所示:

public final class MyClass{

private final Map<String, String> map;

//Called by Thread1
public MyClass( int size ){
this.map = new HashMap<String, String>( size );
}

//Only ever called by Thread2
public final String put( String key, String val ){
return map.put( key, value );
}

//Only ever called by Thread2
public final String get( String key ){
return map.get( key );
}

//Only ever called by Thread2
public final void printMap( ){
//Format and print the contents of the map
}

}

这个类是通过“Thread1”初始化的。但是,put、get、printMap 和其他操作由“Thread2”调用。

我对此类是线程安全的理解是否正确:

  1. 由于对 map 的引用被声明为最终的,所有其他线程将看到 map 的初始状态(happens-before is established)。

  2. 因为 put/get/printMap/etc 只被 Thread2 调用,所以不需要互斥。

谢谢

最佳答案

所以你问的是正确的假设。如果您可以保证它仅以这种方式使用,则无需使其成为线程安全的。您不能在 Java 中传递构建了一半的对象,因此“构造函数可能未完成”是不可能的。

如果你这样做

new Thread(new Runnable() {

public void run() {
final MyClass instance = new MyClass(10);
new Thread(new Runnable() {
public void run() {
instance.put("one", "one");
....
}

}).start();
}

}).start();

你很好 :) 这就是你所描述的,由 Thread1 创建但仅供 Thread2 使用。线程无法与自身发生冲突。

线程安全是一个不同的定义,其中组合实体可以安全地与多个线程交互。在您描述的情况下,这种情况不会发生,因为您本质上有一个构造线程和另一个操作线程。

关于Java Happens-Before 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709720/

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