Java 类对象上的同步

Java 类对象上的同步,java,multithreading,concurrency,Java,Multithreading,Concurrency,当我阅读以下示例时,我正在阅读关于concurreny的教程: 下面是与静态方法相同的两个示例。这些方法在方法所属类的类对象上同步: 只有一个线程可以同时在这两个方法中的任何一个内执行 第二个已同步的块是否已在其他服务器上同步 对象,则每个线程内部可以执行一个线程 方法 我只是想确保我做对了 所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗 我想困扰我的更多是翻译 请举一个带有注释的示例。否。这两个方法都在MyClass.class上同步。因此,如果一个线

当我阅读以下示例时,我正在阅读关于concurreny的教程:

下面是与静态方法相同的两个示例。这些方法在方法所属类的类对象上同步:

只有一个线程可以同时在这两个方法中的任何一个内执行

第二个已同步的块是否已在其他服务器上同步 对象,则每个线程内部可以执行一个线程 方法

我只是想确保我做对了

所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗

我想困扰我的更多是翻译


请举一个带有注释的示例。

否。这两个方法都在MyClass.class上同步。因此,如果一个线程调用任何一个方法,另一个线程就不能同时调用这两个方法中的任何一个


如果一个方法在另一个对象上同步,那么这两个方法不再互斥,一个线程可以调用log2,而另一个线程可以调用log1。

否。这两个方法都在MyClass.class上同步。因此,如果一个线程调用任何一个方法,另一个线程就不能同时调用这两个方法中的任何一个


如果一个方法在另一个对象上同步,那么这两个方法不再互斥,一个线程可以调用log2,而另一个线程可以调用log1。

否。这两个方法都在MyClass.class上同步。因此,如果一个线程调用任何一个方法,另一个线程就不能同时调用这两个方法中的任何一个


如果一个方法在另一个对象上同步,那么这两个方法不再互斥,一个线程可以调用log2,而另一个线程可以调用log1。

否。这两个方法都在MyClass.class上同步。因此,如果一个线程调用任何一个方法,另一个线程就不能同时调用这两个方法中的任何一个

如果一个方法在另一个对象上同步,那么这两个方法不再互斥,一个线程可以调用log2,而另一个线程可以调用log1

所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗

确切地说,您不能同时在不同的线程中调用方法log1和log2。声明方法
静态同步
与在类对象上同步具有相同的效果

下面是一个示例,其中第二个方法在
log
变量而不是类上进行同步

public class MyClass {

  public static synchronized void log1(String msg1, String msg2){
    log.writeln(msg1);
    log.writeln(msg2);
  }

  public static void log2(String msg1, String msg2){
    synchronized(log){
      log.writeln(msg1);
      log.writeln(msg2);  
    }
  }

}
在这种情况下,两个单独的线程可以同时执行
log1
log2
,因为它们在不同的对象上同步:
MyClass.class
对象上的
log1
,以及
log
对象上的
log2
(无论定义在哪里)

以下是有关同步方法和块的关键事项:

  • 同步的代码必须使用相同的对象实例进行同步 跨越所有线程
  • 类也是对象!一个给定类的对象通常只有一个实例,在第一次加载该类时创建
  • 所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗

    确切地说,您不能同时在不同的线程中调用方法log1和log2。声明方法
    静态同步
    与在类对象上同步具有相同的效果

    下面是一个示例,其中第二个方法在
    log
    变量而不是类上进行同步

    public class MyClass {
    
      public static synchronized void log1(String msg1, String msg2){
        log.writeln(msg1);
        log.writeln(msg2);
      }
    
      public static void log2(String msg1, String msg2){
        synchronized(log){
          log.writeln(msg1);
          log.writeln(msg2);  
        }
      }
    
    }
    
    在这种情况下,两个单独的线程可以同时执行
    log1
    log2
    ,因为它们在不同的对象上同步:
    MyClass.class
    对象上的
    log1
    ,以及
    log
    对象上的
    log2
    (无论定义在哪里)

    以下是有关同步方法和块的关键事项:

  • 同步的代码必须使用相同的对象实例进行同步 跨越所有线程
  • 类也是对象!一个给定类的对象通常只有一个实例,在第一次加载该类时创建
  • 所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗

    确切地说,您不能同时在不同的线程中调用方法log1和log2。声明方法
    静态同步
    与在类对象上同步具有相同的效果

    下面是一个示例,其中第二个方法在
    log
    变量而不是类上进行同步

    public class MyClass {
    
      public static synchronized void log1(String msg1, String msg2){
        log.writeln(msg1);
        log.writeln(msg2);
      }
    
      public static void log2(String msg1, String msg2){
        synchronized(log){
          log.writeln(msg1);
          log.writeln(msg2);  
        }
      }
    
    }
    
    在这种情况下,两个单独的线程可以同时执行
    log1
    log2
    ,因为它们在不同的对象上同步:
    MyClass.class
    对象上的
    log1
    ,以及
    log
    对象上的
    log2
    (无论定义在哪里)

    以下是有关同步方法和块的关键事项:

  • 同步的代码必须使用相同的对象实例进行同步 跨越所有线程
  • 类也是对象!一个给定类的对象通常只有一个实例,在第一次加载该类时创建
  • 所以你不能在一个线程中同时调用log1和log2方法?但是如果类对象上没有同步,你可以吗

    确切地说,您不能同时在不同的线程中调用方法log1和log2。声明方法
    静态同步
    与在类对象上同步具有相同的效果

    下面是第二个方法在
    log
    变量instea上同步的示例