2015-05-06 8 views
6

Stavo osservando il codice sorgente Java per la classe AtomicInteger (trovata here) per vedere quali primitive atomiche sono richieste per implementare una JVM. Ho notato che usano l'API non documentata Unsafe per implementare le loro operazioni di intero atomico e che le uniche due primitive che usano sembrano essere le operazioni compare and swap e compare and set. E la classe Unsafe implementa queste istruzioni come metodi nativi che mi portano a credere che stiano usando le istruzioni native che eseguono queste operazioni primitive nel caso generale. Tuttavia, non tutti i processori (sebbene quelli più moderni lo fanno) hanno un set di istruzioni che supporta nativamente questi primitivi. Ora, anche senza il supporto del processore nativo, queste primitive potrebbero essere implementate dalla VM in modo da garantire l'atomicità con altri thread VM, ma non necessariamente con altri thread nativi. Quindi java richiede che queste primitive nell'architettura nativa abbiano una JVM valida e quindi tutte le implementazioni JVM supportino l'atomicità con i thread nativi, oppure l'atomicità in java è garantita solo tra i thread java?Do Java Atomics richiede solo atomicità rispetto alla VM

+2

Vorrei fare una risposta, ma non riesco più a trovare i collegamenti. Il gruppo che implementa la JVM su ciascuna architettura determina il codice. Se l'architettura supporta le istruzioni atomiche, allora è quello che viene usato. In caso contrario, il codice emula quelle istruzioni atomiche. Potrebbe essere CAS o LL/SC o codice simulato. Se trovo questi link, pubblico di più. – edharned

+0

@edharned bene se il supporto per l'atomicità con i thread nativi dipende dall'architettura, quindi non è garantito dalle specifiche JVM e quindi corretto? Il che vuol dire che una JVM implementata su un'architettura che non supportava quelle istruzioni (o la capacità di riprodurre l'effetto di quelle istruzioni) sarebbe comunque una JVM valida. –

+0

Su quali piattaforme non sono presenti istruzioni atomiche è stato eseguito il porting della JVM? Non sono a conoscenza di alcun – the8472

risposta

3

La JNI non fornisce alcun modo per un thread nativo per ottenere l'indirizzo di una variabile Java. Tutti gli accessi alla variabile, sia dal codice bytecode Java che da un thread nativo, devono passare attraverso i macchinari JVM. Quindi la tua domanda è davvero discutibile.

L'atomica Java "richiede l'atomicità rispetto alla JVM" e "rispetto alla JVM" è la solo la causa che conta.

+0

grazie, credo che non stavo pensando a come ottenere un handle per i dati dal codice nativo, ma l'unico modo che non viola la JVM è attraverso JNI e JNI sarebbe richiesto di modificare comunque tutti i valori atomici. –

+0

In teoria si, in pratica l'utilizzo di buffer mappati in memoria + Unsafe può essere rilevante, ma se lo fai ti stai sostanzialmente spostando all'esterno delle specifiche JVM. Anche se questo potrebbe cambiare con le modifiche JMM pianificate per java9 – the8472

+0

@ the8472 a seconda dell'implementazione VM che si sta utilizzando, è probabile che si possa capire l'indirizzo dell'heap JVM e ottenere la posizione effettiva in memoria di una particolare variabile, ma poi hai violato le specifiche della VM e non è garantito che funzioni nelle specifiche. –

2

L'unico sistema operativo noto che non supporta CAS o LL/SC è The SPARC 32 and PA-RISC. Come documentato nel JSR-133 Cookbook (vai alla sezione Multiprocessori), la risoluzione per questo è a build da ldcw. Che è riportata come

L'unica atomica primitiva su PA-RISC è ldcw, una forma di test-and-set, da cui si avrebbe bisogno di costruire aggiornamenti condizionali atomiche usando tecniche come ad esempio quelli del bianco HP carta su spinlock.

http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf

anche alcune informazioni sul futexes

https://parisc.wiki.kernel.org/index.php/FutexImplementation

+0

Ok, queste sono alcune informazioni interessanti su quelle specifiche implementazioni, ma in realtà non ha risposto alla mia domanda che è se viola o no le specifiche JVM per implementare una JVM in cui le operazioni atomiche non sono garantite per essere atomiche a thread nativi ma sono garantiti per essere atomici per i thread JVM. –

Problemi correlati