[Multithread]if e assegnazione thread safe

di il
6 risposte

[Multithread]if e assegnazione thread safe

private LinkedList<Integer> list = new LinkedList<Integer>();
private synchronized int foo(int x){
    if(x>=0){ //do something
        list.add(x);
        return x    }
    else {

        int tmp = list.removeFirst();
        return tmp;
    }

    return -1;
}
public void test(int id)
{
    if(foo(id)==-1)
        //do something
        }

public void test2(int id){
    int y=foo(id);
    System.out.println(id+" "+ y);
}
se un pool di thread accedono ai metodi test2 e test loperazione di assegname int y=foo(id); e if(foo(id)==-1) restano thread safe?
grazie per la risposta

6 Risposte

  • Re: [Multithread]if e assegnazione thread safe

    Non si e' capito che cosa stai chiedendo.

    Comunque ricorda questo: il contest switch avviene TRA DUE ISTRUZIONI PRIMITIVE (assembler o l'equivalente per la VM di Java)

    Non avviene, ovviamente, a meta' di un'istruzione! Ad esempio, se deve copiare i 4 byte di un intero, non avvienet dopo che ne ha copiati 3!
  • Re: [Multithread]if e assegnazione thread safe

    migliorabile ha scritto:


    Non si e' capito che cosa stai chiedendo.
    mi scuso, mi sono reso conto che la domanda e' un po' criptica

    migliorabile ha scritto:


    Comunque ricorda questo: il contest switch avviene TRA DUE ISTRUZIONI PRIMITIVE (assembler o l'equivalente per la VM di Java)
    si ovviamente, quello che mi chiedo e se nel caso avvenga preemption subito dopo la chiamata a foo questo possa comportare incoerenza dei dati provo a fare un esempio
    se ho 2 thread A e B che accedono in maniera concorrente al metodo test2 posso trovarmi ad avere un id associato al thread A e una Y associata al thread B?
    la stessa cosa vale anche nel metodo test?
  • Re: [Multithread]if e assegnazione thread safe

    Anche peggio di prima!
  • Re: [Multithread]if e assegnazione thread safe

    Ci riprovo chi sa che la terza sia quella giusta
     int y=foo(id);
    e' una istruzione atomica? non puo' avvenire un context switch prima che venga completata ad esempio dopo che viene chiamata la funzione foo ma prima di assegnare il valore a y?
    if(foo(id)==-1)
    stessa cosa qui
  • Re: [Multithread]if e assegnazione thread safe

    Certo che puo' avvenire!

    E' atomica l'operazione di assegnare un valore ad una variabile, NON come quel valore viene calcolato.

    Il bytecode di java e' l'equivalente dell'assembler: le istruzioni assembler sono atomiche, ma il context switch puo' avvenire tra due istruzioni (assembler) qualunque.
  • Re: [Multithread]if e assegnazione thread safe

    Quindi se ho 2 Thread A e B il thread A ha id=1 il thread B ha id=2 il valore atteso per y di A e' 7 e quello di B e' 8
    ricapitolando
    
    A                |             B
    id=1             |             id=2
    y=7              |             y=8
    
    A entra nel metodo test2 accede a foo a y viene assegnato il valore di 7 ma prima di stampare il valori subisce uno switch context
    B entra nel metodo test2 accede a foo a y viene assegnato il valore di 8 anche questa volta prima di stampare il valore subisce uno switch context
    A riprende il controllo e stampa
    quali valori vengono stampati da A?

    ps scusami per le mille domande
Devi accedere o registrarti per scrivere nel forum
6 risposte