Synchronized ou volatile?

2 respostas
M

Qual melhor usar ou “quando usar” qual e por que?

volatile int x = 0;
x++;

ou

int x = 0;
synchronized int plus() {
    return x++;
}

ou ainda

int x = 0;
synchronized(x) {
    x++;
}

O que me dizem?

Eu usaria o volatile pelo que acabo de aprender dele (vide topico sobre obscuridade), apesar do volatile não ser totalmente suportado por todas as JVM’s…

Pelo que aprendi até agora, todas as soluções funcionariam, mas:

Sincronizar o método parece mais lento, afinal voce está tendo o overhead de sincronizacao + o de chamada de método…
Sincronizar a variavel parece viável, apesar de sujar bastante o código (imagina um monte de sincronização no código, fica horrível)…

Criar a variável como volatile parece o mais interessante, já que ela é automaticamente “sincronizada”, pois todas as operações nela ficam atômicas…

Pesquisei um pouco, e pra quem não souber aqui vai o que achei:

É essa aí a descrição de uma operação atômica, que é o que o synchronized e volatile fazem.

E ai, o que dizem sobre as opcoes?

2 Respostas

M

e tem como pegar o lock de um tipo primitivo? :roll:

int x = 0; synchronized(x) { x++; }

M

“matheus”:
e tem como pegar o lock de um tipo primitivo? :roll:

int x = 0; synchronized(x) { x++; }

Que eu saiba não hehe, mas foi só pra ilustrar o exemplo :slight_smile:

Nesse caso pior ainda né, afinal teoricamente se voce tiver MUITAS threads, pode acontecer de perder operações no valor.

Pelo que aprendi hoje (continuei lendo mais umas 2h), muita coisa não é como deveria ser hehe

Cada thread obtem copias locais, quando uma thread atualiza, ela atualiza a cópia dela e depois propaga pra memoria principal ou seja, mais uma possibilidade de falhar, no caso das copias nao estarem totalmente sincronizadas entre si…

Acho que pra ter certeza mesmo só testando, algo como:

Cria 2048 threads, cada uma faz um “i++” em uma variavel global, de modo que cada uma faça sei lá, 100.000.000 de incrementos…

Se no final o resultado não for

2.048.000.000, então teve problema de “skipping” mesmo…

De fato, vou testar isso mais tarde se lembrar!

Criado 10 de novembro de 2004
Ultima resposta 10 de nov. de 2004
Respostas 2
Participantes 2