首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >synchronized方法与synchronized块

synchronized方法与synchronized块
EN

Stack Overflow用户
提问于 2011-05-27 17:54:42
回答 3查看 1.5K关注 0票数 4

如果我有以下代码

代码语言:javascript
运行
复制
class SomeClass {    
...
public synchronized methodA() {
....
}

public synchronized methodB(){
....
}
}

这将在' This‘对象上同步。

但是,如果我这里的主要目标是确保多个线程不同时使用methodA (或methodB),但它们可以同时使用methodA和methodB,

那么这种设计有限制吗?因为在这里thread1锁定对象(与对象相关联的监视器对象)以运行methodA,但是同时thread2也在等待对象锁定,即使methodA和methodB可以同时运行。

这种理解是正确的吗?

如果是,这是不是我们在私有虚拟对象上使用synchronized块的情况,以便methodA和methodB可以在不同的线程上并行运行,而不是methodA (或methodB)在不同的线程上并行运行。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-27 17:58:44

您自己已经回答了这个问题:每个方法使用一个锁对象,您就是安全的。

代码语言:javascript
运行
复制
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodA() {
    synchronized(lockA){
        ....
    }
}
public void methodB() {
    synchronized(lockB){
        ....
    }
}

有关更高级的锁定机制(例如ReentrantLock),请阅读Brian Goetz等人的Java Concurrency in Practice。您还应该阅读Effective Java by Josh Bloch,它还包含了一些关于使用synchronized的内容。

票数 9
EN

Stack Overflow用户

发布于 2011-05-27 17:59:45

如果您希望允许同时运行methodA()methodB(),但将每个方法限制在一个线程中,那么您需要两个单独的对象进行同步。例如:

代码语言:javascript
运行
复制
class SomeClass {
    private final Object lockA = new Object();
    private final Object lockB = new Object();

    public void methodA() {
        synchronized (lockA) {
            // 
        }
    }

    public void methodB() {
        synchronized (lockB) {
            // 
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-05-27 18:01:01

如果我的理解是正确的,那么您希望允许线程T1同时运行methodA()线程T2运行methodB() --但是您不希望线程T1同时运行methodA()线程T2运行methodA() (对于methodB也是如此),对吗?对于这个场景,您不能只使用一个简单的同步方法--正如您所说的,您将需要两个虚拟对象(一个用于methodA,一个用于methodB)来进行同步。或者您可以使用新的Lock类--每个方法一个Lock实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6150583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档