синхронизированные блоки для статических и нестатических методов - PullRequest
2 голосов
/ 11 декабря 2010

Я создал два потока и использовал один экземпляр класса, который называется статическим и нестатическим методами этого объекта.В идеале статические методы должны вызываться с использованием имени класса, и я тоже это сделал.

Я синхронизировал статические и нестатические методы на частном статическом члене класса, чьи методы вызывают потоки.Я заметил, что выходные данные были синхронизированы!

Мои вопросы:

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

Ответы [ 2 ]

4 голосов
/ 11 декабря 2010

В глобальном масштабе существует один экземпляр того, что называется StaticNonStaticTest.object.Всякий раз, когда вы синхронизируете на этой вещи ( независимо от того, откуда ), вы синхронизируете на одной и той же блокировке.

0 голосов
/ 08 мая 2011

Вы синхронизируете на основе статического объекта, поэтому блокировка получается на уровне класса, а статический и нестатический методы синхронизируются. Если вы закомментируете строку «synchronized (object)» в статических и нестатических методах, вы увидите, что вызовы больше не синхронизируются.

...