jni / java: publicación / uso compartido seguro de objetos nativos efectivamente inmutables

1) Tengo una función nativa de Java que pasa varios parámetros y su implementación es un constructor nativo de C ++ para crear un objeto y devuelve un largo que se lanza desde el puntero al objeto. Los miembros construidos de este objeto son efectivamente inmutables. El objeto C ++ puede hacer un trabajo basado en su estado construido.

2) el código Java que obtiene el resultado de la llamada a la función publica de manera segura la versión larga del puntero en algún lugar (sin mutex) y cambia una variable volátil para poder publicar los cambios de memoria en el objeto C ++ nativo en otros hilos

Ahora, otro subproceso lee esa variable volátil de 2), y luego retoma esa publicación larga, y llama a otra función nativa que accede a ese objeto efectivamente inmutable en el espacio de memoria C ++ para hacer un trabajo.

Pregunta: ¿Se garantiza que ese otro hilo verá el objeto nativo completamente construido debido a que el Modelo de memoria de Java garantiza volátiles y cercas? Apuesto a que la respuesta es sí en algunas plataformas, pero veo que diferentes chips funcionan de diferentes maneras con el uso de cercas, y me preguntaba sobre todas las plataformas para las que Java está disponible.

Respuesta 1

Un coautor de JCIP respondió la pregunta en la lista de correo de JSR para concurrencia.

Él dice: "JMM [no hace] garantiza que se extienda a cualquier cosa fuera del montón de Java, o más específicamente, solo se aplica a los campos de Java", pero que "en la práctica, las barreras / cercas utilizadas hoy en día son de grano grueso y afectarán a toda la memoria por igual ", entonces" que en la práctica esto [el volátil intento de publicación descrito en la pregunta] funcionará bien (siempre que esté utilizando la memoria de proceso normal) ".

Otro encuestado en la lista de correo dice: "Algunos de nosotros definitivamente consideramos que es un objetivo asegurar que la sincronización Java, C y C ++ funcione en conjunto como se esperaba, con la sincronización Java que proporciona las garantías de visibilidad correctas para las variables C o C ++, y viceversa". pero agrega que "no hay garantía escrita de ese [comportamiento]".

Respuesta: 2

Lo que pasa del código java al código nativo se copia y se pasa en los tipos de datos apropiados para el código nativo (por ejemplo, C++tiene unsigned intmientras Javaque no, nullcadenas terminadas , etc.).
Después de eso, cualquier problema de subprocesos está relacionado con la implementación del código nativo.
Esencialmente es lo mismo una API. ¿Cuáles son los contratos para la API? ¿Especifica que se puede acceder de manera segura por múltiples hilos o no?

Respuesta: 3

Mi código no funciona para este método, estoy tratando de sumar la suma de la suma de los números; si n = 3, devuelve 10; n = 6, devuelve 56; este es mi código: public int sumOfSums (int n) {int [] ...

¿Hay alguna manera de importar la biblioteca externa .net en eclipse? es una biblioteca de creación propia y quiero importarla en eclipse. Es posible ?

[ADVERTENCIA] Regla 3: org.apache.maven.plugins.enforcer.DependencyConvergence falló con el mensaje: Falló al aplicar la capacidad de liberación, los errores son [Error de convergencia de dependencia para xml-apis: ...

Construyo la imagen desde Dockerfile: DESDE ubuntu RUN apt-get update Luego guardo la imagen en mi computadora local y obtuve este archivo, por ejemplo: archive.ubuntu.com_ubuntu_dists_bionic_restricted_binary -...