Thread-Safe e Single-Thread?

Galera eu ouso muito falar sobre isso, principalmente no hibernate. O que vem a ser um objeto que eh single-thread e um que eh thread-safe? Como define isso? Pra uqer serve? que impacto tem no desenvolvimento? Vlw galera

Aplicações- não objetos - são multi-thread ou single-thread. Ou seja, podem ter 1 (single) ou muitas (multi) linhas (threads) de execução.

Objetos têm que funcionar mesmo quando muitas threads os tentam usar ao mesmo tempo. Objetos que tomam esses cuidados são seguros para uso com threads (thread-safe). normalmente os objetos não são contruidos para serem seguros para uso com multiplas threads : primeiro porque é chato e segundo pq afeta a performace ( pelo menos afetava até ao java 1.6 ter aparecido … )

Aplicações- não objetos - são multi-thread ou single-thread. Ou seja, podem ter 1 (single) ou muitas (multi) linhas (threads) de execução.

Objetos têm que funcionar mesmo quando muitas threads os tentam usar ao mesmo tempo. Objetos que tomam esses cuidados são seguros para uso com threads (thread-safe). normalmente os objetos não são contruidos para serem seguros para uso com multiplas threads : primeiro porque é chato e segundo pq afeta a performace ( pelo menos afetava até ao java 1.6 ter aparecido … )

[/quote]

Humm, entao quer dizer que objetos comuns sao multi-thread(Isso eu ja sabia). Entao vc quis dizer que tem como criar objetos que sao thread-safe? Ou seja, que apenas uma thread pode acesse-lo, eh isso? Como faz isso? Abraços

Aplicações- não objetos - são multi-thread ou single-thread. Ou seja, podem ter 1 (single) ou muitas (multi) linhas (threads) de execução.

Objetos têm que funcionar mesmo quando muitas threads os tentam usar ao mesmo tempo. Objetos que tomam esses cuidados são seguros para uso com threads (thread-safe). normalmente os objetos não são contruidos para serem seguros para uso com multiplas threads : primeiro porque é chato e segundo pq afeta a performace ( pelo menos afetava até ao java 1.6 ter aparecido … )

[/quote]

Humm, entao quer dizer que objetos comuns sao multi-thread(Isso eu ja sabia).
[/quote]

Vc não entendeu. Objetos não são multi-thread. Aplicações é que são multi-thread.
Por padrão vc cria objetos que não funcionam bem com muitas threads acessando-os simultaneamente

[quote]
Entao vc quis dizer que tem como criar objetos que sao thread-safe? Ou seja, que apenas uma thread pode acesse-lo, eh isso? Como faz isso? Abraços[/quote]

Ser Thread-safe significa que o objeto pode ser usado em aplicações com multiplas-thread usando o mesmo objeto (não a mesma classe, a mesma instância)

Existem várias técnicas para tornar um objeto thread-safe, mas a mais simples é usar a palavra synchronized nos métodos do objeto e ter todos os atributos privados.

Procure por problemas de concurrencia para entender melhor qual é o problema.

Um exemplo:

[code]public class Foo {
private int x;
private int y;

public Foo() {
    x = 50;
    y = -50;
}

public void mudaValor() {
    x++;
    y--;
}

// Deve ser sempre igual a zero.
public int somaTotal() {
    return x + y;
}

}[/code]

Essa classe não é thread-safe. Ela funciona perfeitamente em thread única (em uma única Thread, somaTotal sempre retorna zero).
Mas, se esta classe for acessada ao mesmo tempo por várias threads, coisas ruins podem acontecer. Por exemplo, a thread A invoca o método mudaValor() ao mesmo tempo que a thread B invoca somaTotal. Por azar, o que ocorre é que a Thread A executa x++, em seguida a Thread B executa o return, avaliando x e y, e só depois a Thread A executa y–. O resultado disso é que somaTotal acaba retornando 1 de forma inesperada.

Para deixar este código thread-safe, pode-se fazer isso:[code]public class Foo {
private volatile int x;
private volatile int y;

public Foo() {
    x = 50;
    y = -50;
}

public synchronized void mudaValor() {
    x++;
    y--;
}

// Deve ser sempre igual a zero.
public synchronized int somaTotal() {
    return x + y;
}

}[/code]Outra alternativa, normalmente mais simples, é simplesmente confinar o objeto não-thread-safe a uma única thread. Ou seja, criá-lo de tal forma que apenas uma única thread o veja.

Quando o objeto puder ser acessado por várias threads ao mesmo tempo, ele deve ser thread-safe, e as duas formas mais simples e comuns de se conseguir isso são:

  1. Fazendo o objeto ser imutável.
  2. Usando sincronização nos lugares adequados.
    Há outras formas bem complexas e avançadas também, mas em 97% das vezes, isso já será o bastante.
1 curtida