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

2024-03-13

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

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

我的问题是:

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

在全球范围内,存在一种称为StaticNonStaticTest.object。每当你同步那个东西时(无论来自何处),您正在同一把锁上进行同步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态和非静态方法的同步块 的相关文章

随机推荐