Sincronizado

o seguinte código:

public int x;

public void metodo1(){
    --x;
}

public synchronized void metodo2(){
    x = 11;
    metodo1();
    assert (x == 10);
}

Pode ou não lançar um assertion error?
Ou seja, a dúvida é: O método não sincronizado é chamado de dentro do método sincronizado, durante essa chamada, outras treads podem acessar o objeto?

[]'s

[quote=tiostan]o seguinte código:

public int x;

public void metodo1(){
    --x;
}

public synchronized void metodo2(){
    x = 11;
    metodo1();
    assert (x == 10);
}

Pode ou não lançar um assertion error?
Ou seja, a dúvida é: O método não sincronizado é chamado de dentro do método sincronizado, durante essa chamada, outras treads podem acessar o objeto?

[]'s
[/quote]

Pode lançar AssertionError.
Thread1 entra em metodo2, seta o x para 11, entra em metodo2 e coloca o x em 10. Logo após, Thread2 chama o metodo1 (sem ser de dentro de metodo2) e deixa x em 9. Thread1 continua e chega no assert. AssertionError.