Modificador Static na memória

Pessoal,

Gostaria de saber como a VM se comporta qdo 2 Threads acessam um mesmo metodo static, se este metodo seria duplicado para atender as 2 requisições simultaneamente ou o q aconteceria internamente na memória ?

Como assim duplicado? Isso nao existe.

O que acontece se as duas threads entrarem no mesmo tempo eh que uma vai alterar os dados da outra e vice-versa…no final eh muito provavel que o resultado seja um erro no metodo…

suponha:

public class Teste {

  private static int a;

  public static int void somaLouca(a) {
    a = a + a; //op1
    a = a + a; //op2
    return 1+ a++; //op3
  }

Se voce criar um programa main que com duas threads, A e B, elas podem executar em qualquer ordem devido o escalonamento da JVM.
Uma sequencia poderia ser, supondo que a=1;
A startou
B startou
A entrou no metodo
B entrou no metodo
A invocou op1 (agora, a==2)
B invocou op1 (agora, a==4)
A invocou op2 (agora, a==8)
B invocou op2 (agora, a==16)
A invocou op3; (retorna a==18)
B invocou op3; (retorna a==20)

Resultado. A thread “A” imprime somaLouca(1)== 18 e a thread “B” imprime somaLouca(1) == 20. Ambas estao erradas.

Se executar com uma thread somente, o metodo retorna somaLouca(1)==6, o que esta certo.

Na verdade isso eh muito improvavel de acontecer, pois um metodo tao pequeno geralmente nao seria quebrado pelo escalonador, mas pode acontecer.

A solucao seria sincronizar os metodos, ou evitar a variavel comum “a”.

Mas nunca um metodo eh duplicado em memoria…

Att.

Rocket,

Entendo do problema utilizando atributos membro não sincronizados, porém minha dúvida estaria mais situada sobre o funcionamento interno do static na memória, qual seria a grande vantagem de termos um metodo static e não static se em nenhum caso este é duplicado?

Um metodo static seria mais rápido que um metodo de instancia, por exemplo?

ambos metodos tem o mesmo tempo de execucao…
no modelo do java (e qualquer outra linguagem) tem uma area comum com os codigos dos algoritmos e para cada instancia de dado, uma area de dados privativos.
Usar metodos estaticos tem justificativa quando nao queremo ter que instanciar um objeto para invocar um metodo.
Exemplos? Varios. O padrao singleton é um. Um metodo de fabrica eh outro. Inicializadores estaticos anonimos (blocos static {}) sao uteis para inicializarem recursos. Outros exemplos podem ser computacao de variaveis estaticas (por que instanciar um objeto para executar um algoritmo sobre variaveis estaticas) ou mesmo funcoes para operacoes sobre classes de objetos, como contadores de objetos ou construtores personalizados.
Enfim, metodos estaticos podem e sao muito uteis…mas nao sao mais rapidos…

ESTA RESPOSTA VEIO DE UMA FONTE CONFIÁVEL , MAS NÃO VOU DIVULGAR QUEM A RESPONDEU, POR QUESTÕES ÉTICAS

Na verdade, quando você trabalha com Threads, todos os métodos terão uma área na memória stack exclusiva, mesmo as static.

Isso implica que as variáveis que você declarar no corpo de seu método static serão exclusivas, não sendo compartilhadas entre todas as chamadas que forem realizadas de maneira simultânea.

portanto, se você possuir o método static:

public class Teste{

public static void test(){
int dois = 2;
}

}

A variável dois não será compartilhada, ainda que o método static seja. A execução de 2 threads que acessam este método estarão isolados em áreas de memória stack diferentes.

No entanto, se tivermos um atributo, a coisa começa a mudar de figura:

public class Teste{

private static long dois = 10;
public static void test(long d){
dois = d ;
}

}

Na situação acima, o atributo dois estará compartilhado entre todas as threads, e portanto sujeito a acesso concorrente.

Os problemas estão de fato no momento em que você começa a mexer em atributos compartilhados. Os métodos não geram problemas por conta de variáveis que são declaradas em seu interior.

On Wed, 29 Mar 2006 00:25:09 -0300, “marcio” <marcioduran@terra.com.br> escreveu:

> De: “marcio” <marcioduran@terra.com.br>
> Data: Wed, 29 Mar 2006 00:25:09 -0300
> Para: “‘Ricardo Jun Taniguchi’” <ricardo@globalcode.com.br>
> Assunto: RES:Threads … e o compartilhamento
>
>
> Opaaa !!! …Ricardo,
>
> Boa noite , estou reformulando a pergunta … para melhor esclarecimento…
>
>
>
> Eu gostaria de saber como a VM se comporta qdo 2 Threads acessam um
> mesmo método static, se este método seria duplicado para atender as 2
> requisições simultaneamente ou o que aconteceria internamente na memória ?

[quote=BLACKHAT]ESTA RESPOSTA VEIO DE UMA FONTE CONFIÁVEL , MAS NÃO VOU DIVULGAR QUEM A RESPONDEU, POR QUESTÕES ÉTICAS

Na verdade, quando você trabalha com Threads, todos os métodos terão uma área na memória stack exclusiva, mesmo as static.

Isso implica que as variáveis que você declarar no corpo de seu método static serão exclusivas, não sendo compartilhadas entre todas as chamadas que forem realizadas de maneira simultânea.

portanto, se você possuir o método static:

public class Teste{

public static void test(){
int dois = 2;
}

}

A variável dois não será compartilhada, ainda que o método static seja. A execução de 2 threads que acessam este método estarão isolados em áreas de memória stack diferentes.

No entanto, se tivermos um atributo, a coisa começa a mudar de figura:

public class Teste{

private static long dois = 10;
public static void test(long d){
dois = d ;
}

}

Na situação acima, o atributo dois estará compartilhado entre todas as threads, e portanto sujeito a acesso concorrente.

Os problemas estão de fato no momento em que você começa a mexer em atributos compartilhados. Os métodos não geram problemas por conta de variáveis que são declaradas em seu interior.

On Wed, 29 Mar 2006 00:25:09 -0300, “marcio” <marcioduran@terra.com.br> escreveu:

> De: “marcio” <marcioduran@terra.com.br>
> Data: Wed, 29 Mar 2006 00:25:09 -0300
> Para: “‘Ricardo Jun Taniguchi’” <ricardo@globalcode.com.br>
> Assunto: RES:Threads … e o compartilhamento
>
>
> Opaaa !!! …Ricardo,
>
> Boa noite , estou reformulando a pergunta … para melhor esclarecimento…
>
>
>
> Eu gostaria de saber como a VM se comporta qdo 2 Threads acessam um
> mesmo método static, se este método seria duplicado para atender as 2
> requisições simultaneamente ou o que aconteceria internamente na memória ?
[/quote]

este comportamento eh o normal para todas as chamadas a metodos (e nao somente a metodos estaticos)…
alem disso, a grosso modo, vc pode considerar um metodo estatico como sendo um metodo de instancia de um objeto Class…
(nota: a JVM oficial (da sun e versao 1.5) ainda nao aloca os objetos no stack (coloca td no heap), mesmo se o objeto nao ‘escapar’)