Newsgroup: it.comp.java
Titolo: Accesso esclusivo tra thread

Ho un problema con un programma multithreading:
vari thread accedono contemporaneamente ad un oggetto con metodi diversi, 
nel mio caso si tratta di un file che viene scritto, letto e modificato da 
vari metodi di un thread e questo comporta errori perchè magari mentre lo 
modificando da una parte, da un altra cerco di aggiungere una riga in coda e 
così si incasina tutto. Purtroppo rendere ogni metodo che accede al file 
synchronized non mi aiuta perchè comunque il file è unico e l'accesso non lo 
fa un solo metodo all'interno del thread, ma almeno 3 metodi operano su tale 
file, come posso fare per rendere quest'oggetto File immodificabile se un 
thread già ci sta lavorando su? 

IMHO devi riprogettare il tuo sw.
Sviluppa una classe che fa accesso al file: lei e solo lei esporrà
metodi che accedono a questo file. Ovviamente questi metodi dovranno
essere synchronized.
Di questa classe dovrà esserci in giro una e una sola istanza (pattern
singleton).
In tutti i punti in cui devi scrivere su file ti fai dare l'istanza
della tua classe e ne invochi i metodi opportuni.

Si ci avevo pensato però in realtà a me servono 2 diversi metodi per 
modificare un file: uno che scriva in coda al file esistente ed uno che 
elimini una determinata riga dal file, anche se li dichiaro entrambi 
synchronized è vere che mentre eseguo il 1° metodo nessun altro thread lo 
potrà eseguire, però è anche vero che un altro thread può contemporaneamente 
eseguire il 2° metodo che scrive anch'esso sul file e qui iniziano i casini, 
come posso evitare questo problema? 


eh, si, troppo bello così :)
Ma scusa, a me hanno sempre spiegato che i file hanno sempre avuto e 
sempre avranno accesso *sequenziale* ...l'unica cosa che puoi fare è 
mapparti il file in memoria e ogni tot salvarlo (syncronizza!!!), un po' 
come fanno i DB. Prova a cercare informazioni sui file memory-mapped 
(package java.nio dal JDK 1.4 in poi)
A proposito, ho notato che in questo NG molti cercano di ri-inventare 
quello che i DB fanno da anni (come in questo caso): che mi dite ? Vuol 
dire che c'è poca fiducia verso i DB? Io invece mi fiderei 1000 volte di 
più di un qualsiasi database scaruso che delle mie classi fatte in 
fretta e senza fare test estesi e completi.
Che mi dite ?
-- 
  -- + Setaceous Pig + --
http://megadix.users.mcs2.netarray.com/
http://www.jroller.com/page/megadix/

Alla fine ho creato una classe con metodi sincronizzati per l'accesso al 
file e funziona egregiamente, grazie per il consiglio. Per quanto riguarda i 
DB purtroppo non li posso implementare perchè questo è un progetto per un 
esame universitario e non ho la possibilità nè il tempo per usare un DB 


Ciao Panda
il tuo e' un caso classico
Synchronized garantisce accesso esclusivo a un metodo
tu vuoi acesso esclusivo ad una intera classe, cioe' a tutti i suoi metodi
ci sono varie tecniche
una potrebbe essere quella di mettere un unico metodo synchro che riceve
come parametro il metodo da chiamare.
e' sicura, semplice ma decisamente "bruttina"
mi spiego
public void synchronized opertateExlusive ( String striNomeFunzione , List
listParams)
{
   if ( striNomeFunzione.equals("accoda") )
      accoda ( listPatrams.elementAt(0) )
   else if ( striNomeFunzione.equals("cancellaUltimaRiga") )
      cancellaUltimaRiga( )
   elseIf
     ........
 }
Avete soluzioni + eleganti ?
Nicola
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 (package java.nio dal JDK 1.4 in poi)
Ciao Dim come va ?
niente ferie ?
Sempre nella stessa Azienda ?
Io ormai sono un "Company Surfer"
5 Aziende in un anno e mezzo
Sempre javoso molto j2ee
nicola9...@liberoFIGA.it ( se non lo hai )


 fretta e senza fare test estesi e completi.
probabilmente si, però non sempre è possibile usare un DB:
- per le performance
- per vincoli politici
- per non rovinare un buon design ad oggetti
- perchè è un esame (come in questo caso)
uL
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
E' vero, ma ad occhio sembrava un problema di lavoro risolto con un 
metodo inadatto (e faticoso). Invece come tema d'esame č ottimo direi :)
Propongo a tutti gli studenti del NG (compreso me) di includere il tag 
[ESAME] nel corpo del messaggio, in modo da evitare lunghe e inutili 
prediche (tipo la mia ehe) da parte di saccenti Java-guru :)
