PDA

View Full Version : [Java] Perchè rendere synchronized un metodo run()


spidey
09-07-2008, 11:33
Salve gente. Qualcuno saprebbe dirmi che effetto ha nel seguente programma rendere synchronized il metodo run() della classe Applicazione?




public class Applicazione implements Runnable{
// dati

public syncronized void run(){
//operazioni
}
}



public class UsaApplicazione extends Thread{

public void run(){
for (int i = 0; i < 5 ; i++)
(new Thread(new Applicazione()).start();
}

public static void main(String args[]){

UsaApplicazione a = new UsaApplicazione();
a.start();
}
}

WarDuck
09-07-2008, 13:13
il synchronized dovrebbe fornirti un Lock di default per evitare di scrivere sulla stessa risorsa contemporaneamente da 2 thread diversi...

Se una risorsa viene usata da un thread non può essere usata da nessun altro thread fino a quando non verrà liberata.

http://java.sun.com/docs/books/tutorial/essential/concurrency/syncmeth.html

Synchronized methods enable a simple strategy for preventing thread interference and memory consistency errors: if an object is visible to more than one thread, all reads or writes to that object's variables are done through synchronized methods. (An important exception: final fields, which cannot be modified after the object is constructed, can be safely read through non-synchronized methods, once the object is constructed) This strategy is effective, but can present problems with liveness, as we'll see later in this lesson.

spidey
09-07-2008, 13:20
Ti ringrazio per la risposta, ma il meccanismo di synchronized mi è chiaro, solo che in questo caso particolare non riesco a capire l'effetto del synchronized sul metodo run(), dato che nn riesco ad identificare una risorsa comune essendo presenti diverse istanze di Applicazione che in teoria hanno ognuno un proprio lock

lovaz
10-07-2008, 10:10
La concorrenza non è mai banale, ma penso che tu abbia ragione.
Viene fatto il lock, ma ogni thread ha la sua istanza, quindi non c'è
niente di condiviso - a meno di non avere campi statici.

peppepz
10-07-2008, 11:06
"synchronized" trasforma run() di Applicazione in una sezione critica.
Siccome un solo thread per volta si può trovare in sezione critica, questo causa che i 5 thread Applicazione che vengono creati nel main verranno eseguiti uno per volta e non tutti e 5 (quasi) contemporaneamente come avverrebbe senza "synchronized".