mit dem folgende Codebeispiel:JMM Garantien innerhalb einer Try-mit-Ressource-Neuordnungs & JNI rufen
try (AutoClosable closable = new XXX()) {
o.method1(closable);
o.method2();
}
Ist das Java-Speichermodell HotSpot closable.close()
vor o.method2()
neu anordnen kann?
Ich verzichte absichtlich auf Implementierungsdetails wie schließt Methode1 verschließbar? im ersten Teil dieser Frage.
Mein spefic Anwendungsfall ist dies:
ich eine C-Bibliothek haben, die wie folgt zusammengefasst werden können:
static char* value;
void capture(char* ptr){
value = ptr;
}
int len(void) {
return strlen(value);
}
Diese native Bibliothek gewickelt JNA mit
interface CApi extends Library {
static {
Native.register("test.so", CApi.class)
}
void capture(Pointer s);
int test();
}
Und mein ursprünglicher Clientcode sieht ungefähr so aus:
Das Problem mit dieser ersten Version ist, dass m
von Java zugewiesen wurde und der Lebenszyklus dieses Speichers an m
gebunden ist, die stark erreichbar ist. m
ist nicht stark mehr erreichbar einmal capture(m)
und Speicher wird freigegeben werden, wenn GC Tritte in (JNA auf finalize
setzen nativen Speicher frei)
Um dies zu verhindern, dass ich JNA die Unterklasse vorgeschlagen Memory
ein AutoClosableMemory
einzuführen. Die Idee ist, dass die Verwendung eines Try-with-Resource-Konstrukts klar aussagen würde, dass die Ressource in diesem Bereich stark erreichbar ist. Der Bonus, dass wir das native Gedächtnis befreien konnten, ist bald da wir es nicht mehr brauchen, anstatt auf einen GC warten zu müssen (hey das ist RAII!). Ich
try (AutoClosableMemory m = [...]) {
cApi.capture(m);
cApi.test();
}
Am garantiert, dass m.close()
nie vor cApi.test()
geltend gemacht werden und dass m
ist stark erreichbar? In diesem Fall wird m
von der zugrunde liegenden C-API erfasst, aber der Java-Compiler hat keine Möglichkeit, sie zu kennen.
Ich war auf der Suche nach etwas wie "es re-Code nie um native Anweisungen" haben Sie einen Link dafür? – Oleg
Native Codeblöcke werden als externe Aktionen in der JLS formalisiert. Sie implizieren eine Vorkommnis-Beziehung mit ihrem vorherigen und nachfolgenden Code. Ich gab einmal diese Präsentation, die Sie hilfreich finden könnten: https://youtu.be/XgiXKPEILoc Ich spreche über externe Maßnahmen in Minute 40. –
Danke, ausgezeichnete Gespräche. Ich denke, du solltest es zu deiner Antwort hinzufügen. Über was Sie hier sprechen (https://youtu.be/XgiXKPEILoc?t=40m37s), wird die Frage von OP genau behandelt. – Oleg