Reordenação sincronizada em java
Sabe-se que a JVM não deve reordenar instruções de usar o bloco sincronizado para fora do bloco sincronizado. Considerando isso, a JVM tem permissão para reordenar a atribuiçãoy = 7
ocorrer após osynchronized
bloco no seguinte snippet?
x = 5;
y = 7;
synchronized (this) {
x = 6;
}
Sabemos que a atribuição de variáveis antes que o bloco sincronizado possa ser reordenado para ocorrer dentro do bloco. Portanto, o seguinte deve ser uma reordenação válida do código inicial:
x = 5;
synchronized (this) {
x = 6;
y = 7;
}
Alguém poderia argumentar que, por se tratar de um pedido válido,y
atribuição @ não pode ocorrer após osynchronized
, pois violaria a regra de que o código de dentro do bloco sincronizado não deve ser reordenado para ocorrer após o bloco e deduzir quey
acontece antes do fim do bloco sincronizado.
Por outro lado, pode ser que todos os pedidos não sejam equivalentes e importa qual foi o pedido real. Especificamente, sey
a atribuição foi feita originalmente dentro do bloco sincronizado e não pôde ocorrer após o bloco, caso contrário, poderi
Para resumir, o próximo pedido está válido no primeiro trecho?
x = 5;
synchronized (this) {
x = 6;
}
y = 7;