Quanto sono isolate le variabili statiche?

7

Se ho un

public class SomeClass {
    public static final HashMap hashmap = new HashMap();
}

e quindi ho cinque diverse classi con metodi main(String[] args) , che eseguirò.

quando accedono a SomeClass.hashmap , accederanno allo stesso HashMap o avranno ciascuno il proprio hashmap creato nella JVM?

    
posta ycomp 20.09.2015 - 19:56
fonte

2 risposte

9

La risposta è "ogni istanza della classe all'interno di un caricatore di classi differenti è distinta."

Se hai due JVM diverse (hai richiamato java MainOne e java MainTwo ), questi sono ovviamente caricatori di classi differenti. Tuttavia, qui ci sono casi d'angolo con cose come nailgun che mantiene in esecuzione la JVM e ... le cose si complicano.

Ci sono anche situazioni come quando l'applicazione viene lanciata da un IDE. Alcuni IDE genereranno una nuova JVM per l'esecuzione dell'applicazione, altri potrebbero lanciare un nuovo caricatore di classi all'interno della propria JVM (non credo che nessuno lo faccia più perché ha reso l'IDE meno idealmente stabile). Anche questo può diventare molto complicato.

Durante l'esecuzione all'interno di un ambiente del server delle applicazioni, può essere configurabile oppure è necessario verificare le specifiche. Tuttavia, renditi conto che ogni possibile combinazione è possibile. Puoi avere l'isolamento di due moduli nello stesso orecchio (ognuno ha un proprio caricatore di classe), puoi condividere l'intero caricatore di classe .ear, puoi avere qualche modalità di compatibilità funky dove tutto condivide il loader della classe .jar, ma è esso stesso in un caricatore di classe isolato per .war, oppure è possibile che l'intero server utilizzi un caricatore di classe. Si noti che alcuni application server hanno cambiato il loro modo di lavorare con versioni diverse (JBoss prima della versione 5 non era isolato, mentre dopo la versione 5 era, e 4.0.2 aveva un programma di caricamento classi gerarchico mentre 4.0.3 veniva ripristinato su un caricatore classe unificato). È un casino. E quindi la chiave di lettura di "static is one per class loader" è la chiave.

È anche possibile avere caricatori di classi diversi all'interno di una singola applicazione come dimostrato in eseguire un file jar eseguibile all'interno del programma java usando i programmi di caricamento classe .

Quindi, tornando alla risposta "ogni istanza della classe all'interno di un altro caricatore di classi è distinta" - e ciò può assumere molte forme e condizioni di bordo diverse.

    
risposta data 21.09.2015 - 00:46
fonte
4

In generale, per la maggior parte delle implementazioni disponibili di JVM, ciascuna delle tue 5 classi otterrà le proprie istanze di hashmap da chiamare e utilizzare, poiché ogni nuovo thread principale verrà eseguito in una nuova JVM. Una nuova JVM viene creata se si utilizza il comando "java" per eseguire il programma.

Se chiamate queste 5 classi principali in 5 thread distinti da una classe tester, verranno eseguite come thread nella stessa JVM. In tal caso, utilizzeranno la stessa hashmap.

( link )

Ci sono altri due scenari interessanti in cui puoi guardare questa domanda da - uno se e se stai facendo girare le tue 5 classi principali come programmi separati su un server, e in secondo luogo se stai usando una multitenancy che supporta Java SDK.

Nel caso del server delle applicazioni, solitamente viene utilizzata la stessa JVM e un nuovo programma di caricamento classi per ogni nuovo programma, quindi, di nuovo, ogni classe principale ottiene la propria hashmap. Per l'ambiente multi-tenant, la stessa hashmap viene condivisa ( link ).

    
risposta data 20.09.2015 - 22:50
fonte

Leggi altre domande sui tag