Я создал два потока и использовал один экземпляр класса, который называется статическим и нестатическим методами этого объекта.В идеале статические методы должны вызываться с использованием имени класса, и я тоже это сделал.
Я синхронизировал статические и нестатические методы на частном статическом члене класса, чьи методы вызывают потоки.Я заметил, что выходные данные были синхронизированы!
Мои вопросы:
Статические методы, если для синхронизации с использованием синхронизированного блока обычно требуется экземпляр класса, то как он принялстатический объект!
Как был синхронизирован вывод, когда потоки, вызывающие статические методы, получают блокировку уровня класса, а потоки, вызывающие нестатические методы, получают блокировку уровня объекта!
Даже если я использовал синхронизированный блоккак статические, так и нестатические методы, основанные на объекте, он действительно не должен синхронизироваться;или это особый случай с синхронизированными блоками статических объектов?
Пожалуйста, дайте мне знать.
Ниже приведен код, который я написал:
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);
}
}
}
}