Java 不可变对象如何帮助防止竞争条件

Java 不可变对象如何帮助防止竞争条件,java,multithreading,immutability,race-condition,Java,Multithreading,Immutability,Race Condition,下面是关于如何防止比赛条件的答案。 最好的办法是创造无副作用和无状态的产品 函数,尽可能多地使用不可变的。但这并不总是如此 可能的所以使用java.util.concurrent.atomic,并发数据 结构、适当的同步和基于参与者的并发将 救命啊 这个答案是说尽可能多地使用不可变的。我对不可变对象如何防止竞争条件感到困惑 只有当至少一个线程被允许写入/更改实例的状态时,才会出现争用条件。不可变实例是只读的,它们的状态不能更改,因此所有线程只能读取对象的状态并看到相同的值。只有当至少一个线程被

下面是关于如何防止比赛条件的答案。

最好的办法是创造无副作用和无状态的产品 函数,尽可能多地使用不可变的。但这并不总是如此 可能的所以使用java.util.concurrent.atomic,并发数据 结构、适当的同步和基于参与者的并发将 救命啊


这个答案是说尽可能多地使用不可变的。我对不可变对象如何防止竞争条件感到困惑

只有当至少一个线程被允许写入/更改实例的状态时,才会出现争用条件。不可变实例是只读的,它们的状态不能更改,因此所有线程只能读取对象的状态并看到相同的值。

只有当至少一个线程被允许写入/更改实例的状态时,才会出现争用条件。不可变实例是只读的,它们的状态不能更改,因此所有线程只读取对象的状态,并在“两个或更多线程。。。并发访问同一个内存位置,并且至少有一个访问用于写入,线程没有使用任何独占锁来控制对该内存的访问。”

如果数据是不可变的,就不会有数据竞争,因为可能没有写访问

此外,委员会:

一旦构建了对象,分配给构造函数中最终字段的值将对所有其他线程可见,而无需同步

当“两个或多个线程。。。并发访问同一个内存位置,并且至少有一个访问用于写入,线程没有使用任何独占锁来控制对该内存的访问。”

如果数据是不可变的,就不会有数据竞争,因为可能没有写访问

此外,委员会:

一旦构建了对象,分配给构造函数中最终字段的值将对所有其他线程可见,而无需同步


当计算结果取决于表达式和语句的求值顺序时,会出现竞争条件

如果表达式和语句的计算改变了状态,产生副作用,结果可能会有所不同

如果代码中的所有内容都是不可变的,则在计算表达式和语句时不会改变状态,也不会产生副作用。因此,计算顺序不会影响最终结果

考虑以下代码:

Map<String, Integer> map = Collections.singletonMap("key", 0);

public void increment() {
    int val = map.get("key);
    map.put("key", val + 1);
}

结果总是一样的,因为没有影响计算的副作用(除了System.out.println所做的更改)。当计算结果取决于表达式和语句的求值顺序时,会出现竞争条件

如果表达式和语句的计算改变了状态,产生副作用,结果可能会有所不同

如果代码中的所有内容都是不可变的,则在计算表达式和语句时不会改变状态,也不会产生副作用。因此,计算顺序不会影响最终结果

考虑以下代码:

Map<String, Integer> map = Collections.singletonMap("key", 0);

public void increment() {
    int val = map.get("key);
    map.put("key", val + 1);
}

结果总是一样的,因为没有副作用(除了System.out.println所做的更改)这会影响计算。

如果一个对象是不可变的,那么不管有多少线程访问它。如果不能修改对象,就不能进行并发修改。如果一个对象是不可变的,那么不管有多少线程访问它。如果不能修改对象,就不能进行并发修改。