首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混淆Java同步方法、同步(此)和同步类

混淆Java同步方法、同步(此)和同步类
EN

Stack Overflow用户
提问于 2018-09-02 00:29:04
回答 2查看 111关注 0票数 2

我很困惑,因为Java的同步概念。

让我们假设下面的类:

代码语言:javascript
复制
class MyClass {
  public synchronized void foo() { //do something }
  public void bar() {
    synchronized(this) { //do something }
  }
  public void normal() { //do something }
}

据我所知,foobar方法的工作原理是一样的。

但是,在线程A进入bar方法并通过synchronized(this)同步实例之后,任何线程都能调用正常的方法吗?

据我所知,一些线程可以调用普通方法,而不需要调用foo方法。但是我不确定何时调用bar方法,因为它同步了一个实例。

另外,让我们假设以下方法:

代码语言:javascript
复制
class StaticMyClass {
  public static synchronized void fooStatic() { //do something }
  publi static void barStatic() {
    synchronized(StaticMyClass.class) { //do something }
  }
  public static void normalStatic() { //do something }
}

在这里,也有同样的问题。当线程A进入关键部分(即synchronized(StaticMyClass.class)fooStatic方法)后,任何线程都能调用normalStatic吗?

我认为fooStaticnormalStatic可以单独调用,但是barStaticnormalStatic不能。如果它是错误的,为什么?

谢谢你的帮助。

编辑:

我的困惑之处是,我不确定synchronized(this)是否与synchronized(myClassInstance)相同。

代码语言:javascript
复制
MyClass my = new MyClass();
synchronized(my) {
  //do something, Any other thread can't access my.normal(), is it right?
}

class MyClass {
  public synchronized void foo() { //do something }
  public void bar() {
    synchronized(this) {
      //do something, isn't this same as above synchronized(my)?
    }
  }
  public void normal() { //do something }
}
EN

回答 2

Stack Overflow用户

发布于 2018-09-02 00:44:05

如果不指定谁是监视器,则使用实例方法,监视器是实例(this),使用静态方法,监视器是类(YourClass.class)。

这段代码

代码语言:javascript
复制
public synchronized void foo() { //do something }

它和这个一样

代码语言:javascript
复制
public void foo() {
   synchronized(this) { //do something }
}

这段代码

代码语言:javascript
复制
public static synchronized void fooStatic() { //do something }

是一样的

代码语言:javascript
复制
public static void fooStatic() {
   synchronized(StaticMyClass.class) { //do something }
}

因此,在这两种情况下,foo和bar都是依赖的(同时只有一个线程),而法线可以独立调用。

票数 1
EN

Stack Overflow用户

发布于 2018-09-02 00:47:36

但是在线程A进入bar方法并通过同步(This)同步实例之后,任何线程都可以调用正常的方法吗?

在同一个对象上对同步方法进行两次调用是不可能的。当一个线程为一个对象执行同步方法时,调用同一对象块的同步方法的所有其他线程(挂起执行),直到第一个线程与该对象一起完成为止。

如果您试图调用其他不同步的方法,那么这是可能的。

当线程A进入同步(StaticMyClass.class)或fooStatic方法的关键部分后,任何线程可以调用normalStatic吗?我想,调用fooStatic和normalStatic可以独立调用,但是barStatic和normalStatic不能。如果它是错误的,为什么?

没有同步的其他方法可以独立调用,但是当您调用barStatic()时,不可能调用其他方法,因为您正在同步整个类。其他线程,必须等到当前线程完成执行。

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

https://stackoverflow.com/questions/52133130

复制
相关文章

相似问题

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