Pergunta

temos dois segmentos acessando uma lista através de um método sincronizado. Podemos

a) contar com o tempo de execução para certificar-se de que cada um deles receberá o acesso ao método baseado na ordem em que eles tentaram ou

b) que a VM acompanhar quaisquer outras regras

c) há uma maneira melhor para serializar os pedidos?

Foi útil?

Solução

Não, sincronizado dará acesso em qualquer ordem (depende da implementação JVM). Isso poderia até mesmo causar Threads para morrer de fome em alguns cenários.

Você pode garantir a ordem usando ReentrantLock (desde Java 5.0) com a opção fair=true. (Lock lock = new ReentrantLock(true);)

Outras dicas

Não, você não pode ter certeza de que duas chamadas para um método sincronizado irá ocorrer em ordem. A ordem é não especificado e implementação dependentes.

Esta é definido na 17,1 Locks do JLS. Observe que é não diz nada sobre a ordem em que threads à espera de um bloqueio deve ter acesso.

Você não pode contar com a ordem em que o método particular é chamado de cada threads. Se for apenas dois segmentos podem ser sim. Mas imagine se existem 3 linhas e 1 fio de acesso já adquirido. Os outros 2 segmentos quando eles tentam acessar esperar e qualquer um deles pode ser concedido o acesso, e isso não depende da ordem em que eles chamaram este método. Assim, não é sugerido para confiar na ordem.

c) há uma maneira melhor para serializar os pedidos?

Você por acaso usando a lista como uma fila, ou seja, faz o padrão de uso algo parecido com isto?

while (some condition) {
    synchronized(theList){
        anItem = get and remove an element from theList
    }
    do some work with anItem
}

Se assim for, você pode querer olhar para o BlockingQueue interface em vez de usar seus próprios esquemas de bloqueio. As implementações (como ArrayBlockingQueue ) têm configurações para a justiça e muito mais.

Eu sempre deixo sincroniza para servidor de aplicações ou o motor a menos que a definição própria intensidade

Sim.

Se o acesso à lista é através de um método sincronizado, solicitações simultâneas de vários segmentos será serializado.

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