Contexto static considerando várias Threads

Eae galera, beleza.

Minha dúvida é sobre as desvantagens de declarar métodos como static;

Considerando um contexto no qual precisarei de um método que não depende do estado do objeto, e que será acessado por múltiplas threads, há alguma possibilidade de, durante a execução das threads, elas “confundirem” as variáveis de referencia/objetos criados localmente para este método, e acabar resultando em um comportamento indesejável?

Essa dúvida surgiu considerando que variáveis locais ficam no stack, e no caso de um método static, não há uma “divisão” de estado entre as threads (só existiria uma de cada variável local no contexto static ou várias, uma para cada thread?).

Algumas fontes me disseram que o “estado” local do método poderia sim ser “confundido” pelas threads, afirmando que não seriam criadas uma variável para cada objeto que a thread venha a criar no contexto estático, assim perdendo referencias de objetos criados previamente no heap. Mas tentei simular casos de uso caóticos com threads e manipulações de objetos String, e tudo me pareceu normal.

Enfim, espero ter conseguido expressar minha dúvida.

Bom, se o seu método static usar apenas variáveis locais de tipos primtivos, com certeza você não terá problema algum. Se os objetos que você criou dentro do seu método forem acessados somente através de variáveis locais, as chances de você ter problema também são baixas. O problema que você pode ter é quando você usar objetos dentro do seu método de classes que façam algum tipo de cache ou compartilhem estado entre eles, de forma que você não controla esse estado.

tive um problema parecido com esse, enquanto trabalhava em um sistema multi-thread e utilizava metodos estaticos.
teoricamente, utilizando apenas variaveis locais, não deveria haver concorrencia entre as threads, mas na prática não foi isso que aconteceu.

você pode utilizar métodos estaticos em um ambiente multi-thread tranquilamente, desde que adicione o modificador synchronized aos seus métodos.
nesse caso você esta dizendo ao compilador que seus metodos devem ser thread-safe.

[quote=heatcold]tive um problema parecido com esse, enquanto trabalhava em um sistema multi-thread e utilizava metodos estaticos.
teoricamente, utilizando apenas variaveis locais, não deveria haver concorrencia entre as threads, mas na prática não foi isso que aconteceu.

você pode utilizar métodos estaticos em um ambiente multi-thread tranquilamente, desde que adicione o modificador synchronized aos seus métodos.
nesse caso você esta dizendo ao compilador que seus metodos devem ser thread-safe.[/quote]

Sim, nesse caso você garante que apenas uma thread executará aquele método por vez. A desvantagem disso é que você cria um gargalo na sua aplicação. Se todas as threads tiverem que executar esse método, o desempenho pode cair bastante.

Muito obrigado pela resposta, de fato concordo plenamente :slight_smile:

[quote=heatcold]tive um problema parecido com esse, enquanto trabalhava em um sistema multi-thread e utilizava metodos estaticos.
teoricamente, utilizando apenas variaveis locais, não deveria haver concorrencia entre as threads, mas na prática não foi isso que aconteceu.

você pode utilizar métodos estaticos em um ambiente multi-thread tranquilamente, desde que adicione o modificador synchronized aos seus métodos.
nesse caso você esta dizendo ao compilador que seus metodos devem ser thread-safe.[/quote]

Sério que na prática ainda pode haver essa falha?

Então quer dizer que, uma aplicação com um simples utilitário para formatação de datas que tenha um método estático, no qual é invocado toda vez que é necessário para fazer um simples insert em uma tabela “data_nascimento” por exemplo, está sujeito a gravar informações inconsistentes no banco? Sendo assim todas as aplicações que vi até hoje estão sujeitas a esta falha…

Parece meio duvidoso pra mim que isto aconteça na prática :frowning:

[quote=chimufox][quote=heatcold]tive um problema parecido com esse, enquanto trabalhava em um sistema multi-thread e utilizava metodos estaticos.
teoricamente, utilizando apenas variaveis locais, não deveria haver concorrencia entre as threads, mas na prática não foi isso que aconteceu.

você pode utilizar métodos estaticos em um ambiente multi-thread tranquilamente, desde que adicione o modificador synchronized aos seus métodos.
nesse caso você esta dizendo ao compilador que seus metodos devem ser thread-safe.[/quote]

Sério que na prática ainda pode haver essa falha?

Então quer dizer que, uma aplicação com um simples utilitário para formatação de datas que tenha um método estático, no qual é invocado toda vez que é necessário para fazer um simples insert em uma tabela “data_nascimento” por exemplo, está sujeito a gravar informações inconsistentes no banco? Sendo assim todas as aplicações que vi até hoje estão sujeitas a esta falha…

Parece meio duvidoso pra mim que isto aconteça na prática :([/quote]

“Método estático” != “variável estática”. O problema, obviamente, é se esse método estático usa variáveis estáticas; nesse caso, você precisará de sincronização.

[quote=entanglement][quote=chimufox][quote=heatcold]tive um problema parecido com esse, enquanto trabalhava em um sistema multi-thread e utilizava metodos estaticos.
teoricamente, utilizando apenas variaveis locais, não deveria haver concorrencia entre as threads, mas na prática não foi isso que aconteceu.

você pode utilizar métodos estaticos em um ambiente multi-thread tranquilamente, desde que adicione o modificador synchronized aos seus métodos.
nesse caso você esta dizendo ao compilador que seus metodos devem ser thread-safe.[/quote]

Sério que na prática ainda pode haver essa falha?

Então quer dizer que, uma aplicação com um simples utilitário para formatação de datas que tenha um método estático, no qual é invocado toda vez que é necessário para fazer um simples insert em uma tabela “data_nascimento” por exemplo, está sujeito a gravar informações inconsistentes no banco? Sendo assim todas as aplicações que vi até hoje estão sujeitas a esta falha…

Parece meio duvidoso pra mim que isto aconteça na prática :([/quote]

“Método estático” != “variável estática”. O problema, obviamente, é se esse método estático usa variáveis estáticas; nesse caso, você precisará de sincronização. [/quote]

Entendo que métodos estáticos são diferentes de variaveis estáticas, mas a dúvida é sobre, mesmo usando apenas objetos e variáveis locais, ainda pode haver inconsistencia nos dados.