Newsgroup: it.comp.java
Titolo: hashmap sincronizzate

dunque ho una servlet che parte all'avvio di tomcat e che tramite una
classe java inizializza un Hashmap dichiarata statica con dei valori.
tramite la stessa classe java da varie servlet e jsp  si ricavano i valori
"stivati" nella Hashmap con un metodo cosě fatto:
public static String getPagina(String parametro)
	{	
			String pagina =                  (String)parametriPagine.get(parametro);
			return pagina;
	}
da quel che ho capito(se ho capito)
http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html
i metodi della classe Hashmap non sono sincronizzati.
mi conviene aggiungere un synchronized al mio metodo getPagina??
grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 grazie
dunque intando leggendo unpo' meglio la documentazione penso di aver
capito che non sono sincronizzati solo quei metodi che vanno a modificare
la struttura della Hashmap (magari il delete di un elemento) ; poi ho
pensato che nonostante la mia Hashmap sia static e quindi condivisa da
tutta l'applicazione la stringa che gli viene passata nel metodo
getPagina(String parametro) non č condivisa e pertanto non mi sembra il
caso di sincronizzare il metodo.
ditemi che ho fatto un ragionamento giusto vi pregooooo


 > mi conviene aggiungere un synchronized al mio metodo getPagina??
No
Usa un singleton ben fatto che syncronizza solo la prima richiesta
getInstance al sigleton
questo vale per sola lettura
Se vuoimodificare la Map , vuoi essere j2ee, e vuoi buone prestazioni si
complica un pochino la questione, ma spero non sia il tuo caso
ciao Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ciao Nicola
intanto grazie
per modificare la Map intendi ad esempio fare un delete di un elemento??
cmq il mio metodo va solo in lettura.
ma il ragionamento che ho fatto:
" ho pensato che nonostante la mia Hashmap sia static e quindi condivisa da
tutta l'applicazione la stringa che gli viene passata nel metodo
getPagina(String parametro) non è condivisa e pertanto non mi sembra il
caso di sincronizzare il metodo."
non è sufficiente a escludere la necessità di usare un metodo
synchronized???


 synchronized???
static e synchronized non hanno nulla a che vedere
motivare le risposte e' un po' lungo
se vuoi discuterne ,volentieri con calma e una cosa alla volta
se sei in sola lettura comunque non hai bisogno di sincronizzare nulla
se vuoi una regola pratica
io uso static final (sempre final con static) per le costanti e per nulla
altro
altrimenti metti la testa nel cappio
ciao N


grazie appena posso leggo e rispondo


grazie, appena posso mi guardo cosa è il singleton.
dunque provo a riesporre il mio pensiero(probabilmente sbagliato ma ci
provo)
ammettiamo di avere una classe:
public class Prova
{
	static String miaStringa; 
	public  static synchronized void stampa(String j)
	{
 
		miaStringa=j;
		for(int h=0;h<100000;h++)
		{
				System.out.println(miaStringa);
		}
	}
}
richiamata da una jsp prova.jsp
<%
String id = request.getParameter("ID");
Prova pr=new Prova();
pr.stampa(id);
%>
in questo caso se non si sincronizza il metodo stampa() si rischia che se
arriva una richiesta da un utente A che passa nell'url il parametro ID=8 e 
poco dopo arriva una richiesta dall'utente B che passa nell'url il
parametro ID=2001 anche la richiesta dell'utente A stamperà a video 
2001
2001
ecc.
tutto ciò perchè la stringa miaStringa è condivisa in quanto statica-
nel caso esposto da me è statica la Hashmap parametriPagine e l'unico
metodo che va  a toccare questa Hashmap è
public static String getPagina(String parametro)
 { 
   String pagina =                  (String)parametriPagine.get(parametro);
   return pagina;
 }
se anche arrivano 2 richieste che passano 2 stringhe parametro differenti
non dovrebbe cambiare nulla in quanto i valori in parametriPagine
rimangono gli stessi mentre le 2 richieste arrivano(e si sovrappongono).
stando cosi le cose il fatto che il metodo get() della classe Hashmap sia
sincronizzato o meno non dovrebbe interessarmi e cmq non ho bisogno di
sincronizzare il mio metodo.
la cosa dovrebbe interessarmi invece se oltre a usare il get() usassi
altri metodi che magari vanno a modificare la mia Hashmap; in questo caso
mi sembrerebbe necessario sincronizzare le richieste.
oppure la cosa dovrebbe interessarmi qualora passassi al metodo get() un
parametro dichiarato statico nella mia classe e quindi condiviso da tutta
la applicazione.
se non è cosi spiegatemi che rischi si potrebbero correre(nel mio caso)
qualora i metodi in lettura di Hashmap non fossero sincronizzati.
probabilmente ho detto un mucchio di idiozie ma è da poco che ho scoperto
che esiste anche il synchronized.
grazie




1. MI pare che a livello logico hai detto cose sensate
2. L'uso di static stai notando tu stesso che ti porta in situazioni
abbastanza imprevedibili che portano il programmatore ad aumentare la
possibilita' di sbagliare.
In pratica non e' sbagliato ne' vietato , ma fortemnente sconsiglliato, e i
tuoi esempi ne sono una dimostrazione
3. Se vogliamo pero' dibattere a scopo scientifico e per divertimento,
bisognerebbe prima di tutto capire se synchronyzed funzia su una static
cosi'0 come una classe normale.
Bidognerebbe o provare o trovare qualcosa, ma con google di getto non ho
trovato nulla
4. supponiamo che funzia se no siamo fermi
5. nelle jsp hai so scope nella dichiarazione di variabili e puoi usare
"application"
6 se proprio ti sei innamorato di static
 
   class Ciao{
   .....
    static Map parametriPagine;
      static
      {
         parametriPagine = new HashMap();
          parametriPagine.set("nome", "Nicola");
     }
    public String getPagina(String parametro)
    {
       String pagina = (String)parametriPagine.get(parametro);
   return pagina;
     }
dovrebbe gia' essere una classe Ok ( anche se continua a non piacere perche
se devi fare operazioni complesse quando crei la Map non pui lavorare dentro
lo static)
in questo caso non ti serve syncronized perche sei in lettura
alla prossima puntata
cya N
Per questo motivo si usano altre strade


 cya N
il punto 1 mi rende abbastanza contento.
non sono innamorato di static, è che mi sembrava un buon metodo x potere
accedere a dei valori da tutte le mie servlet e le mie jsp-
+che altro gli altri a cui ho pensato mi sembravano un po' 'pesanti'.
cmq grazie moltissimo


..la prossima volta pensero' subito a qualcosa per evitare static
ciao


un metodo a cui non avevo pensato:
 potrei fare una classe con una serie di costanti dichiarate static(ehm
hai detto che questo non è poi così sbagliato) e recuperarle da tale
classe.
che te ne pare?


un metodo a cui non avevo pensato:
potrei fare una classe con una serie di costanti dichiarate static(ehm
hai detto che questo non è poi così sbagliato) e recuperarle da tale
classe.
che te ne pare?
-- 


 che te ne pare?
Se sono costanti va benissimo static
anche la Hashmap se non cambia mai va benissimo
anzi e' il'uso canonico di static, magari anche final
i problemi nascono se vuoi modificare i dati
cya N
