PDA

View Full Version : [JAVA] dubbio su variabili condivise tra Thread


noodles83
18-01-2010, 16:01
ho un dubbio a cui non so darmi una risposta.

Nella mia classe principale ho il main in cui istanzio un vector

Vector<myObject> vett= new Vector<myObject>();

... lo riempio con alcune istruzioni etc...

dopo mi creo un Thread, con apposito Runnable (myTask), che voglio condivida questo vector, quindi ho fatto:

Thread th = new Thread( new myTask(vett));
th.start();

l'esecuzione di questo thread trova il vettore vuoto! sono sicuro che è pieno ovviamente.

come mai? :confused:

noodles83
18-01-2010, 17:06
RISOLTO.

facevo io una cavolata e sincronizzavo male i thread. pardon.:D

nuovoUtente86
18-01-2010, 17:17
le specifiche dicono che nel momento in cui starti il thread, questo vede lo stato dell' array relativamente all' ultima azione di chi lo ha lanciato, in questo caso il thread main, quindi un array riempito nello specifico.

fero86
18-01-2010, 18:05
attenzione ai volatili :p

noodles83
19-01-2010, 22:46
altra domanda...

le API di java indicano che Vector<T> è "synchronized".

Il fatto che sia synchronized mi evita di inserire i suoi metodi d'istanza dentro blocchi synchronized(vettore){} perchè i metodi sono già sincronizzati?

Se lo facessi sarei solo ridondante?

fero86
19-01-2010, 23:41
altra domanda...

le API di java indicano che Vector<T> è "synchronized".

Il fatto che sia synchronized mi evita di inserire i suoi metodi d'istanza dentro blocchi synchronized(vettore){} perchè i metodi sono già sincronizzati?

Se lo facessi sarei solo ridondante? é una spiegazione un po' casinosa ma grossomodo si... per l'esattezza gli oggetti della classe Vector sono thread-safe: puoi richiamarne i metodi da qualunque thread anche se le chiamate si sovrappongo per parte o per tutta la loro durata, lo stato dell'oggetto resta consistente. non é detto che l'implementazione di Vector usi metodi synchronized per raggiungere tale scopo: puó anche darsi che si basi parzialmente o interamente sull'atomicitá delle operazioni, cosa piu efficiente.

banryu79
20-01-2010, 10:45
é una spiegazione un po' casinosa ma grossomodo si... per l'esattezza gli oggetti della classe Vector sono thread-safe: puoi richiamarne i metodi da qualunque thread anche se le chiamate si sovrappongo per parte o per tutta la loro durata, lo stato dell'oggetto resta consistente. non é detto che l'implementazione di Vector usi metodi synchronized per raggiungere tale scopo: puó anche darsi che si basi parzialmente o interamente sull'atomicitá delle operazioni, cosa piu efficiente.
Per la cronaca: Vector è sincronizzato* con l'uso della keyword synchronized, non fa uso di altre tecniche più efficienti, e dal sorgente leggo che non è più stato aggiornato dal 2006.
La classe Vector è presente nel JDK dalla versione 1.0: e' legacy code; aveva subito un retrofitting che gli faceva implementare List al passaggio alla versione 1.2 del JDK perchè diventasse un membro del neo-introdotto Collection Framework (infatti alcuni metodi della sua interfaccia pubblica non sono dichiarati come synchronized ma fungono da meri wrapper dei vecchi metodi synchronized).

attenzione ai volatili :P
Altrimenti son "volatili per diabetici" :asd:

@EDIT:
sincronizzato*, in effetti è più corretto dire che è thread-safe.

fero86
20-01-2010, 13:30
Altrimenti son "volatili per diabetici" :asd: "sono CHÉZZI AMARI!!!"
Lino Banfi, Fracchia la Belva Umana :asd: :asd: :asd: