Newsgroup: it.comp.java
Titolo: a che serve la parola chiave 'synchronized' ?

a che serve la parola chiave 'synchronized' ? 
Spero che sia come immagino: cioč, metodi dichiarati con questa parola
chiave, indicano alla JVM che diversi thread non possono accedere
contemporaneamente a quei metodi, ma devono attendere la terminazione
dell'esecuzione del metodo prima di ogni nuova chiamata. E' cosě?

 dell'esecuzione del metodo prima di ogni nuova chiamata. E' così?
Quasi..  in realtà  mentre un metodo synchronized è in esecuzione un
qualunque altro thread non puo' accedere a ^nessun^ metodo di
qeull'oggetto..

 qeull'oggetto..
Quello che affermi mi sembra sbagliato.
Prova a compilare ed eseguire questo frammento di codice, temo rimarrai
sorpreso...
[SOURCE]
public class No extends Thread{
 private boolean isRunning=false;
 private int val=0;
 public static void main(String[] args){
  No me=new No();
  me.exec();
 }
 public void exec(){
  Thread th=new Thread(this);
  this.setDaemon(true);
  this.start();
  while(!isRunning);
  System.out.println("Tento di accedere al metodo setVal impostando val ad
1");
  this.setVal(1);
  System.out.println("Se l'accesso è riuscito, tento di accedere al metodo
getVal che dovrebbe ritornare 1");
  System.out.println("Il metodo getVal ritorna "+this.getVal());
 }
 public void setVal(int i){
  val=i;
 }
 public int getVal(){
  return val;
 }
 public synchronized void run(){
  System.out.println("Il metodo 'synchronized' run è in esecuzione");
  while(true){
   isRunning=true;
  }
 }
}
[/SOURCE]
Ciao,
Maurizio.

 qeull'oggetto..
Sei sicuro? Io ho sempre pensato che lockasse solo il metodo o
l'oggetto/variabile

 wrote in message
news:Yjyg7.1408$423....@news.infostrada.it...


In ngJg7.3658$
423.1...@news.infostrada.it
, Ettore,


Ti riporto una frase da un libro di Java (Java 1.1 Tutto&Oltre) che riguarda
proprio questo, e che ho avuto modo di verificare in passato sia attraverso
altri libri, sia praticamente:
"Un solo thread può eseguire un metodo synchronized su un oggetto in un
determinato momento, ma qualsiasi thread può eseguire i metodi non
sincronizzati." (Mentre i sincronizzati non può eseguirli).
Ciao



esatto, synchronized blocca il monitor associato all'oggetto
quindi quando un thread blocca il monitor esclude gli altri thread
synchronized puo' essere usata anche in questo modo
synchronized (oggetto)
{
	...codice...
}
ciao_O
_______________________________________
http://jame.sourceforge.net
 
[ last release jame4.2b ]
_______________________________________
http://digilander.iol.it/schiele

ciao_O
da questo esempio deduco che posso bloccare il monitor a tutte le
istanze di una classe dichiarata synchronized.
Giusto?
Grazie a tutti per le dritte fornite fino adesso

 esecuzione,getVal potrebbe essere invocato?
No. Mentre un thread accede un metodo synchronized di un oggetto tutti e
soli i metodi synchronized dello stesso oggetto sono bloccati.
Se provi a modificre il codice che ho postato piu sopra e rendere setVal
synchronized l'esecuzione si pianta.
Diciamo che la verità sta nel mezzo tra l'ipotesi "tutti i metodi lockati" e
quella "nessun metodo lockato" :-}
public synchronized void ciao,
Maurizio.

 wrote in message
news:3b83ecac...@news.comm2000.it...




???
io intendevo che puoi bloccare il monitor di un oggetto a tuo piacere
tipo
public class Demo
{
	private Object semaforo; //naturalmente va bene qualsiasi classe (tutte estendono Object)
	public Demo()
	{
		semaforo = new Object();
	}
	public void faiQuesto()
	{
		synchronized (semaforo)
		{
			...codice...
		}
	}
	public void faiQuello()
	{
		synchronized (semaforo)
		{
			...codice...
		}
	}
}
oppure puoi fare cosi'
public class Demo
{
	public Demo()
	{
		...
	}
	public void faiQuesto()
	{
		synchronized (this)
		{
			...codice...
		}
	}
	public void faiQuello()
	{
		synchronized (this)
		{
			...codice...
		}
	}
}
che equivale a 
public class Demo
{
	public Demo()
	{
		...
	}
	public synchronized void faiQuesto()
	{
		...codice...
	}
	public synchronized void faiQuello()
