静态和非静态方法的同步块

时间:2010-12-11 06:06:25

标签: java multithreading static synchronization

我创建了两个线程并使用了一个类的实例,称为该对象的静态和非静态方法。理想情况下,需要使用类名调用静态方法,我也这样做。

我在类的私有静态成员上同步了静态和非静态方法,这些成员的线程正在调用它们的方法。我注意到输出已同步!

我的问题是:

  1. 静态方法如果使用synchronized块同步它通常需要类实例,那么它是如何接受静态对象的!

  2. 当调用静态方法的线程获取类级别锁定并且调用非静态方法的线程获取对象级别锁定时,输出如何同步! 即使我在基于对象的静态和非静态方法中都使用了synchronized块,它实际上也不应该同步;或者是静态对象上的同步块的特殊情况吗?

  3. 请告诉我。

    以下是我写的代码:

    public class StaticNonStaticSynch 
    {
     public static void main(String[] args) 
     {
      final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest();
    
      Runnable runnable1 = new Runnable() 
      {
       @Override
       public void run() 
       {
        staticNonStaticTest.nonStaticMethod();
       }
      };
    
      Runnable runnable2 = new Runnable() 
      {
       @Override
       public void run() 
       {
        staticNonStaticTest.staticMethod();
       }
      };
    
      Thread thread1 = new Thread(runnable1, "First Thread");
      Thread thread2 = new Thread(runnable2, "Second Thread");
    
      thread1.start();
      thread2.start();
     }
    }
    
    class StaticNonStaticTest
    {
     private static Object object = new Object(); 
    
     void nonStaticMethod()
     {
      synchronized (object) 
      {
       for(int i=0;i<500;i++)
       {
        System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i);
       }
      }
     }
    
     static void staticMethod()
     {
      synchronized (object)
      {
       for(int i=0;i<500;i++)
       {
        System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i);
       }
      }
     }
    }
    

2 个答案:

答案 0 :(得分:4)

在全球范围内,存在一个名为StaticNonStaticTest.object的事件实例。无论何时同步该事物(无论来自哪个),您都在同一个锁上进行同步。

答案 1 :(得分:-1)

您正在基于静态对象进行同步,这就是在类级别获取锁定并同步静态和非静态方法的原因。 如果在静态和非静态方法中注释掉“synchronized(object)”行,则可以看到调用不再同步。