gpt4 book ai didi

java - java中形式参数的同步

转载 作者:搜寻专家 更新时间:2023-10-31 19:58:21 25 4
gpt4 key购买 nike

假设我有一个方法,它被两个或多个线程访问,我想让它成为线程安全的。

public int getVal(int x, int y, MyClass myObj)  
{
int z;

z = getInt(myObj);

return x + y + z;
}

在此,我认为我们不必为 x + y 同步,因为它们是原语。

假设 getInt(myObj) 修改了 myObj 的状态并影响了 z 的值。

因此,我必须为 z = getInt(myObj); 行提供同步,但前提是两个线程都在“myObj”引用中传递相同的实例。作为 API 的编码器,我不知道两个线程是否会为“myObj”传递相同的实例。在某些情况下,这些线程可能会在“myObj”引用中传递相同的 MyClass 实例,而在其他情况下,它们可能会在“myObj”引用中传递不同的 MyClass 实例。

那么,如何确保行 z = getInt(myObj) 的线程安全? (当然,当传递的实例不同时,我们不想同步,而只需要在传递的实例相同时同步。我很清楚,这是无法确定的)。

假设不能使 MyClass 不可变,我认为以下可能是一个解决方案。

synchronized(myObj)
{
z = getInt(myObj);
}

这是正确的解决方案吗?以及,我们还有哪些其他方式可以确保线程安全

z = getInt(myObj); (but only in case of different instances)?

最佳答案

你所拥有的是正确的。当您在对象上同步 时,它会锁定该实例而不是该类。因此,如果我将对象的相同 *实例* 传递给两个不同 方法,它将正确锁定该对象。但是,如果我传递两个不同的实例,则不会有任何锁定,因为两个实例 都有自己的

关于java - java中形式参数的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251024/

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