首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用同步关键字的Java锁

使用同步关键字的Java锁
EN

Stack Overflow用户
提问于 2014-12-14 02:05:18
回答 2查看 101关注 0票数 0

我在一个教程中看到了这一点,他们问下面的代码是否有问题。在我看来,b()似乎无法访问,因为a()已经拥有对监视器的控制。我这么想对吗?

代码语言:javascript
复制
public class Test {
    public synchronized void a() {
        b();
        System.out.println("I am at a");
    }
    public synchronized void b() {
        System.out.println("I am at b");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-14 02:22:07

不,那个代码没有问题。注意两件事:

  1. synchronized SomeType foo() { ... }等价于 SomeType foo() {同步(此){.}} 它锁定封闭类的this实例。因此,在您的例子中,a()b()锁定的是相同的东西。
  2. 如果一个线程已经在某个对象的监视器上持有一个锁,那么它会阻止另一个线程获取同一个对象上的锁,但是如果需要的话,同一个线程也可以获得更多的锁,这不会受到影响。所以 公开同步的void (){ //获取此b()上的锁;//也可以锁定此锁,但这是可以的,因为它是同一个线程System.out.println("I at a");}当线程在a()中时,没有其他线程能够在同一个实例上调用a()b()。如果他们试图这样做,他们将不得不等待到当前线程退出a()。但是当前线程本身不受影响,它可以调用该对象上的任何同步方法,因为它已经持有锁。
票数 3
EN

Stack Overflow用户

发布于 2014-12-14 02:20:35

不,你错了。线程控制监视器,而不是方法,因此它能够根据需要跟踪执行到同一对象上同步的方法。

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

https://stackoverflow.com/questions/27465648

复制
相关文章

相似问题

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