java - 跨类同步

标签 java multithreading synchronization synchronized critical-section

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

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

我目前的计划是制作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实例作为将修改一组共享对象的实例,那么是的,它可以工作。

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

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

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/

相关文章:

c# - 如何知道哪个方法启动了工作线程

C++/Windows 多线程同步/数据共享

java - 在 Java 类中调用 Kotlin 挂起函数

java - 在Java中合并两个类?

java - 在匿名线程中使用最终变量

java - 消息重新传递 ibm mq

c - 工作线程和 Controller 线程同步

Java:从同步块(synchronized block)启动新线程时会发生什么?

JavaFX FXMLLoader IllegalStateException : Location is not set

java - 如何更改 gridbaglayout 中网格的最小高度