gpt4 book ai didi

java - 跨类同步

转载 作者:行者123 更新时间:2023-11-30 09:04:41 25 4
gpt4 key购买 nike

我有两个并发运行的线程,一个主线程和一个实现 Runnable 的监听器.

主线程和监听器各有一个临界区,具体是方法getObjectList(String)在主线程和 handleNewObjects(String, List<Object>) 中运行的 Manager 类中在监听器线程中运行。

我目前的计划是制作getObjectList()同步方法:

class Manager {

protected synchronized getObjectList() {
// Do critical section stuff
}
}

并制作handleNewObjects()看起来像这样

class Listener implements Runnable {
private final Manager myManager;

handleNewObjects() {
synchronized (myManager) {
// Do critical section stuff
}
}
}

这会确保我的关键部分永远不会同时运行吗?
我应该以其他方式同步吗?

最佳答案

如果 getObjectList() 是同步方法,Listener 中的 myManager 是相同的 Manager instance 作为将修改一组共享对象的实例,那么是的,它会起作用。

如果不知道现有代码之间的关系,很难说是否有更好的解决方案适合您,但是这种方法可能会被视为有些脆弱。更改 Manager 锁定的对象将导致 Listener 不再是线程安全的,并且如果两个关键部分修改的共享对象已经存在于 Manager 中,您可能以及在管理器中调用另一个同步的监听器,例如 myManager.handleNewObjects()

我所说的更改管理器锁定对象的意思是,如果管理器来自:

protected synchronized getObjectList() {
// Do critical section stuff
}

protected getObjectList() {
synchronized (myPrivateFinalLockObject) {
// Do critical section stuff
}
}

protected getObjectList() {
delegatingWorkToSomeOtherThreadSafeObject.getObjectList();
}

然后 Listener 不再是线程安全的,因为它不再将其关键部分锁定在同一对象上。

关于java - 跨类同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148719/

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