我有两个并发运行的线程,一个主线程和一个实现 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/