【问题标题】:synchronized blocks for static and non-static methods静态和非静态方法的同步块
【发布时间】:2010-12-11 06:06:25
【问题描述】:

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

我在线程调用其方法的类的私有静态成员上同步了静态和非静态方法。我注意到输出是同步的!

我的问题是:

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

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

请告诉我。

以下是我写的代码:

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);
   }
  }
 }
}

【问题讨论】:

  • 请正确编辑文本。对代码 sn-p 使用 101010 图标。
  • “调用非静态方法的线程获取对象级锁” 他们不获取对象级锁。实例方法获取类级锁。

标签: java multithreading static synchronization


【解决方案1】:

在全球范围内,存在一个名为 StaticNonStaticTest.object 的事物的实例。每当您在那个东西上同步时(无论从哪里),您都在同一个锁上同步。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多