У меня есть следующий код:Java синхронизируются блок неожиданное поведение
public class Experimenter implements Runnable
{
private volatile Integer a = new Integer(0);
public Experimenter() throws Exception
{
System.out.println("start");
}
public void funk() throws InterruptedException
{
synchronized (a)
{
System.out.println("in");
Thread.sleep(5000);
System.out.println("out");
}
}
public static void main(String[] args) throws Exception
{
Thread a = new Thread(new Experimenter(), "a");
Thread b = new Thread(new Experimenter(), "b");
Thread c = new Thread(new Experimenter(), "c");
Thread d = new Thread(new Experimenter(), "d");
Thread e = new Thread(new Experimenter(), "e");
a.start();
b.start();
c.start();
d.start();
e.start();
}
@Override
public void run()
{
try
{
funk();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
я ожидал, так как только один поток может использовать синхронизированный блок, в то время, было бы напечатать что-то вроде следующего, с 5-секундным отставанием между каждым входом и выходом:
start
start
start
start
start
in
out
in
out
in
out
in
out
in
out
Но вместо этого я получаю следующее. Все входы, через 5 секунд, все выходы:
start
start
start
start
start
in
in
in
in
in
out
out
out
out
out
Не могли бы помочь объяснить это?
Не могли бы вы объяснить необходимость «финала»? – Hele
См. Сообщение редактирование, это прояснит ситуацию. – fge
, тогда он должен использовать блокировку уровня класса? – Prashant