Java 同步引用

发布于 2024-11-03 20:22:22 字数 452 浏览 1 评论 0原文

我有一个 A 类和 B 类。

public class A() { 
    private static List<int> list = new ArrayList<int>(); 
    public static List<int> getList() {
        return list;
    }
}

public class B() { 
    public void foo() {
        synchronized(A.getList()) {
            // DO Stuff
        }
    }
}

在 B 类中我进行同步。这是在 A 的列表上同步,还是在 B 对 A 的列表的引用上同步。我认为是后者,但需要一些帮助。

如果是这样,那么我如何完成与此类似的实际可行的事情?

谢谢!

I have a class A and B.

public class A() { 
    private static List<int> list = new ArrayList<int>(); 
    public static List<int> getList() {
        return list;
    }
}

public class B() { 
    public void foo() {
        synchronized(A.getList()) {
            // DO Stuff
        }
    }
}

In class B where I synchronize. Does this synchronize on A's list, or on B's reference to A's list. I think it is the latter but could use some help.

If so then how do I accomplish a similar thing to this that will actually work?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我还不会笑 2024-11-10 20:22:22

它在 A 的列表上同步。 B 引用 A 的列表是什么意思?无论您是在 A 中使用 list 还是在 B 中使用 A.getList(),它们都引用同一个对象。当您对其进行同步时,您将阻止其他线程在同一对象上同步,无论它是从何处引用的。

It synchronizes on A's list. What do you mean by B's reference to A's list? It doesn't matter if you're in A using list or B using A.getList(), they both reference the same object. When you synchronize on it you'll block other threads from synchronizing on that same object, regardless of where it's referenced from.

如果没结果 2024-11-10 20:22:22

OP 随后发表了这样的评论:

奇怪的是我看到的行为是,如果我从 AI 内部锁定,实际上可以同时在 B 中锁定它。这几乎意味着同步没有效果。这就是为什么我猜测锁定引用可能不起作用。

问题中的代码不会发生这种情况。

但如果 A 中有一个 setList 方法更新了 list 变量,则可能会发生这种情况。然后,您可能会遇到两个线程锁定不同对象的情况。

另一种可能性是,实际上只有一个线程两次锁定同一个对象。这是正常行为。 Java 原始互斥体是可重入的;即它们仅防止两个不同线程同时持有相同的互斥锁。

The OP followed up with this comment:

What's weird is the behavior that I am seeing is that if I lock from within A I can actually lock it at the same time in B. Which pretty much means the synchronized has no effect. Which is why I surmised that maybe locking a reference won't work.

That can't happen with the code in the question.

But it could happen if there was a setList method in A that updated the list variable. You could then end up in a situation where the two threads were locking on different objects.

Another possibility is that you actually only have one thread that is taking a lock on the same object twice. That's normal behavior. Java primitive mutexes are reentrant; i.e. they only prevent two different threads from holding the same mutex at the same time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文