java中的方法同步

java中的方法同步,java,Java,在编写java同步代码时,静态和非静态java同步方法如何并行运行 public class Counter{ private static count = 0; public static synchronized getCount() { return this.count; } public synchronized setCount(int count) { this.count = count; } } 静态方

在编写java同步代码时,静态和非静态java同步方法如何并行运行

public class Counter{

   private static count = 0;

   public static synchronized  getCount()
   {
      return this.count;
   }

   public synchronized setCount(int count)
   {
      this.count = count;
   }
}

静态方法在类对象上同步,而非静态方法在调用它们的类的特定实例上同步。因此,它们可以并行执行,因为它们通常在不同的对象上同步

在以下示例中,
staticMethod1
基本上与
staticMethod2
相同,
method1
method2
相同,只是后一版本使用了显式同步的对象:

class MyClass
{
    static synchronized void staticMethod1()
    {
        doSomething();
    }

    static void staticMethod2()
    {
        synchronized( MyClass.class )
        {
            doSomething();
        }
    }

    synchronized void method1()
    {
        doSomething();
    }

    void method2()
    {
        synchronized( this )
        {
            doSomething();
        }
    }
}

如果您有类“Test”,那么非静态同步将在
(测试类实例)上进行,静态同步将在
测试类
(即java.lang.class实例)上进行。因此,是的,它是完全不同的对象,因此它们可以并行运行。

Java同步就是基于这个概念。每个对象都可以是监视器,并且每段同步代码都引用一个监视器对象。对于同步静态方法,这是类对象。对于同步实例方法,它是实例。对于同步块,将显式指定监视器对象


重要的一点:如果一段同步代码未在同一个监视器对象上同步,则两个线程可以并行执行。如果您有一个同步静态方法和一个同步实例方法,则它们不能具有相同的监视器,因此可以并行执行

方法未锁定,对象已锁定。可以使用不同的对象在同一同步方法中有两个线程。但是,不能让两个线程运行同一对象的不同同步方法


静态方法和非静态方法不会锁定同一个对象。

我仍然不理解这个问题,我对您的代码示例感到困惑。您有引用“this.counter”的静态方法,但“counter”是静态的

在任何情况下,要重新陈述一些其他答案,请考虑:

public static synchronized classMethod() {....}
public synchronized instanceMethod()  {...}
“synchronized”在每种情况下都有两种不同的含义。在静态的classMethod上,“synchronized”应用于类对象的(Counter.class)监视器,而instanceMethod的“synchronized”应用于对象实例的(“this”)监视器


因此,classMethod和instanceMethod不会相互锁定。instanceMethod将阻止另一个非静态同步方法,而classMethod将阻止其他静态同步方法。

能否发布一个代码示例,以使问题更精确?@wrschneider99现在请给我一个答案为什么getter是静态方法,但是您的setter是一个实例方法?如果将synchronized放在方法签名上,则相当于将整个方法体包装在“synchronized(this){…}”或“synchronized(Foo.class){…}”中,具体取决于该方法是否是静态的。如果在方法体中显式使用synchronized,则可以更精确地控制将使用哪个对象的监视器进行锁定。此外,如果正在
wait()
ing,则synchronized块中可以有任意数量的线程,但只能运行一个线程。