Я учусь для сертификации Java, и я вижу этот пример из книги Моголов в:Зачем нужна статическая блокировка для синхронизации system.out.println()?
public class Smiley extends Thread
{
@Override
public void run()
{
while(true)
{
synchronized(this)
{
try
{
System.out.print(":");
Thread.sleep(100);
System.out.print("-");
Thread.sleep(100);
System.out.println(")");
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
new Smiley().start();
new Smiley().start();
}
}
Цель состоит в том, чтобы напечатать один смайлик :-) в каждой строке. Мой вопрос в том, почему синхронизация на экземпляре (это) не достигает этого? Почему нам нужно синхронизировать на статическом уровне?
Спасибо,
Я знаю, что это всего лишь пример, но я хотел бы отметить, что вы обычно не хотят держать блокировки во время сна –
@JohnKane Я согласен с вами, но я предполагаю, что это принудительно переключает контекст и поощряет потоки печатать смайлики с чередованием. –
@ Jonathon Reinhart да Я тоже думал об этом, я просто хотел добавить это как дополнительную заметку для более общего случая. –