Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    9

    metodi statici e synchronize

    ciao a tutti. Oggi mi sono posto il seguente quesito:

    ho un metodo statico che quando invocato, passandogli come parametro il nome di un file, questo legga dentro un valore e diciamo che lo incrementa (in realtà il metodo è molto più complesso, ma credo che il concetto sia il medesimo).

    ora mi chiedo: se invoco lo stesso metodo molte volte consecutive, c'è la possibilità che il metodo legga una cosa e ne scriva una non consistente giusto?
    io vorrei semplicemente che con due invocazioni successive, venga eseguito prima COMPLETAMENTE la prima invocazione e poi la successiva.
    mi basterebbe in questo caso dichiarare il metodo statico synchronized?

    se mi sono spiegato male vi posto una porzione di codice ok?
    grazie mille

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: metodi statici e synchronize

    Originariamente inviato da Peps81
    ora mi chiedo: se invoco lo stesso metodo molte volte consecutive, c'è la possibilità che il metodo legga una cosa e ne scriva una non consistente giusto?
    Più che "molte volte consecutive" sarebbe il caso di dire "da più thread contemporaneamente".

    Originariamente inviato da Peps81
    io vorrei semplicemente che con due invocazioni successive, venga eseguito prima COMPLETAMENTE la prima invocazione e poi la successiva.
    mi basterebbe in questo caso dichiarare il metodo statico synchronized?
    Se il file è usato solo da quella istanza della tua applicazione, sì, basta dichiarare il metodo synchronized. Questo garantisce che 1 solo thread per volta possa entrare nel metodo.
    Se però ci possono essere altri processi esterni che leggono/modificano il file ...... beh no.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    9

    Re: Re: metodi statici e synchronize

    Originariamente inviato da andbin
    Più che "molte volte consecutive" sarebbe il caso di dire "da più thread contemporaneamente".
    si, ho dato per scontato che diverse chiamate vengono effettuate da thread diversi.
    in pratica io sto implementando una struttura già esistente. Ci sono dei metodi callback che vengono invocati quando accadono determinati eventi. Il mio compito è quello di riscrivere tali metodi per associare una azione ad un evento. per fare ciò, e per farlo in maniera più pulita e riusabile ho creato delle funzionalità come metodi statici che invocherò all'occorrenza dall'interno del suddetto metodo callback.
    la struttura è dichiaratamente multithread, anche se non sono certo che l'occorrenza di due eventi uguali ( e che quindi invocano lo stesso metodo callback) generino 2 thread separati, ma è plausibile credo.
    dunque, ma mia preoccupazione è che se avvengono due eventi uguali in rapida successione l'esecuzione dei rispettivi metodi statici si accavallino.

    proverò con dichiarando i metodi synchronized. Conosci qualche metodo per testarne poi la correttezza? Potrei fare dei lunghi cicli di scrittura e vedere l'ordine in cui i due (eventuali) thread vanno a scrivere nel file?

    grazie mille per la chiara e sintetica risposta!
    ciao!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    9
    ma se dichiaro synchronized più metodi, questi si escluderanno a vicenda?
    a me interessa solo che lo stesso metodo non sia invocato contemporaneamente da più thread.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Peps81
    ma se dichiaro synchronized più metodi, questi si escluderanno a vicenda?
    Se sono static e all'interno di una stessa classe ... sì. Perché essendo static allora il "lock" è sull'oggetto Class che rappresenta la classe .... quindi unico.

    Originariamente inviato da Peps81
    a me interessa solo che lo stesso metodo non sia invocato contemporaneamente da più thread.
    Se non vuoi che la invocazione di un metodo statico A sia "esclusivo" rispetto ad un altro metodo statico B nella stessa classe, allora devi usare lock diversi. Usa un Object fittizio.

    codice:
    private static final Object lockA = new Object();
    
    public static void metodoA() {
        synchronized(lockA) {
            ...
        }
    }
    Idem per un altro metodo ma con un altro oggetto per il lock.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    9
    se invece i metodi li tengo in classi differenti ( com'è attualmente), i metodi non saranno mutuamente esclusivi giusto?
    anche se credo non sia molto elegante, invece di fare una libreria di metodi statici in un unico file ho fatto una classe per ogni metodo. Può rivelarsi scorretta questa procedura?

    grazie mille, mi sei stato di grande aiuto!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Peps81
    se invece i metodi li tengo in classi differenti ( com'è attualmente), i metodi non saranno mutuamente esclusivi giusto?
    Classi diverse, quindi oggetti java.lang.Class differenti, quindi lock diversi per i metodi marcati static synchronized.

    Originariamente inviato da Peps81
    anche se credo non sia molto elegante, invece di fare una libreria di metodi statici in un unico file ho fatto una classe per ogni metodo. Può rivelarsi scorretta questa procedura?
    Dipende ... senza avere una idea chiara di cosa vuoi fare di preciso e cosa fanno tecnicamente quei metodi ... non saprei dire.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    9
    beh, sono metodi che uso a mo' di sottofunzioni.
    ad esempio un metodo invocato mi fa un calcolo di potenza media erogata a patire da una trentina di file di log e scrive il risultato in un nuovo file;
    oppure un altro metodo, passando indirizzo, oggetto, testo e allegato effettua la spedizione di una mail; cose del genere.
    potrei creare una classe, chiamarla lib e dichiararvi tutti i miei metodi statici.
    per il momento invece, il metodo sendMail sta nella classe SendMail; etc...


    ogni metodo è dichiarato: public synchronized static void METODO()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.