Pergunta

Eu sou muito novo para thread-safe programação, e queria saber se eu tenho algo como abaixo, isso seria salvo de impasse, uma vez compilado e prazo?

public class Foo  
{  
    protected CustomClass[] _mySynchedData = new CustomClass[10];

    public void processData()
    {
        synchronized(_mySynchedData) {
            // ...do stuff with synched variable here
        }
    }
}


public class Bar extends Foo
{

    @Override
    public void processData()
    {
        synchronized(_mySynchedData) {
            // perform extended functionality on synched variable here

            // ...then continue onto parent functionality while keeping synched
            super.processData();
        }
    }
}


Bar testObj = new Bar();

// Deadlock?
testObj.processData();
Foi útil?

Solução

Seu código exibir apenas um único segmento.

Com apenas um segmento, não há nenhuma maneira você pode obter qualquer impasse.

Adicionado:
suportes da linguagem Java que eles chamam oficialmente reentrada sincronização . Basicamente, significa que um único segmento pode readquirem um bloqueio que já possui.

Outras dicas

A sua pergunta é o que acontece quando você sincroniza duas vezes no mesmo objeto.

A resposta é: Java irá verificar primeiro o segmento possui o monitor (que é a estrutura de dados interna em que synchronized opera). Desde o segmento proprietário é o mesmo que o segmento atual, Java vai continuar.

Os impasses só pode acontecer se você tiver dois monitores e tentar prendê-los em ordens diferentes em diferentes threads.

O bloqueio tomadas pelo Java sincronizado suportes de palavra-chave do assentamento, para que você não arriscar um impasse através da sincronização no mesmo objeto várias vezes no mesmo segmento.

RichN está correto em que seu código contém apenas um único segmento e, portanto impasse é impossível. Observe também que para um impasse ocorrer você precisa ter vários segmentos adquirir vários bloqueios (embora em uma ordem diferente ) para um impasse ocorrer.

Seu código atualmente apenas referências de um bloqueio: A um associado com _mySynchedData. O fato de você tentar bloqueá-lo duas vezes não importa como bloqueios em Java são reentrada .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top