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
risposta
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.
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. –
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
@ 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. –
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
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. –
- 1. Quali sono le alternative alla VM Java?
- 2. Esecuzione più lunga tramite shell Java rispetto alla console?
- 3. Perché l'applicazione compilata VB6 richiede VM VB5?
- 4. Node.js richiede() rispetto a RequireJS?
- 5. Impostazione Java VM line.separator
- 6. C++ Memory Barriers for Atomics
- 7. Atomicità di File.Move
- 8. Do timer hanno una migliore precisione rispetto al sonno()
- 9. Pausa DO While Loop Java?
- 10. python rispetto alla classe
- 11. Netbeans Profiler: Connessione alla destinazione vm per sempre
- 12. Perl condiviso variabili atomicità e visibilità
- 13. Atomicità di C# coalescenza Operatore
- 14. Vantaggi degli esecutori rispetto alla nuova discussione
- 15. Cosa fa 'bundle exec rake' rispetto a rake do?
- 16. VBA: Velocità di iterazione della matrice variante rispetto alla serie tipizzata rispetto alla raccolta senza chiave
- 17. STM con atomicità parziale per alcuni TVars
- 18. Perché il rilascio di un indice richiede più tempo rispetto alla sua creazione?
- 19. Richiede libreria Java modbus
- 20. Java HotSpot 1.6 VM, Garbage Collection - PermGen
- 21. Come posso uscire solo dal mio sottoprogramma, non dall'intera VM?
- 22. Cosa fa il^do?
- 23. Cosa fa java: comp/env/do?
- 24. Buona ingegneria del software rispetto alla sicurezza
- 25. Come ottenere argomenti vm dall'interno dell'applicazione java?
- 26. Oracle Java 7-8 Hotspot VM
- 27. Ottimizzazione Java VM - Xbatch e -Xcomp
- 28. Java VM non riconosce -XX: G1YoungGenSize?
- 29. Bugs rispetto al miglioramento rispetto alla nuova funzione
- 30. Schema JSON per la descrizione dei dati rispetto alla convalida dei dati rispetto alla convalida dell'input
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
@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. –
Su quali piattaforme non sono presenti istruzioni atomiche è stato eseguito il porting della JVM? Non sono a conoscenza di alcun – the8472