同じネイティブメソッドを呼び出す異なるJavaスレッドから値が変更されていますか?
確かに、グローバル変数が、のことの証明に非常に簡単な例を書いてみましょうだけでなく、スレッドによって、すべての仮想マシンで共有されます。
counter.cで
#include<stdio.h>
int counter = 0;
int incrementAndGet(){
counter++;
return counter;
}
がそれを呼び出しますJNA
final ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 20; i++) {
executorService.submit(() -> {
try {
TimeUnit.MILLISECONDS.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {}
System.out.printf("thread=%s, counter=%d%n", Thread.currentThread().getName(), CounterLib.INSTANCE.incrementAndGet());
});
}
executorService.awaitTermination(10, TimeUnit.SECONDS);
executorService.shutdown();
出力
を使用してJavaで
thread=pool-1-thread-2, counter=1
thread=pool-1-thread-4, counter=2
thread=pool-1-thread-1, counter=3
thread=pool-1-thread-5, counter=4
thread=pool-1-thread-2, counter=5
thread=pool-1-thread-3, counter=6
thread=pool-1-thread-2, counter=7
thread=pool-1-thread-4, counter=8
thread=pool-1-thread-1, counter=9
thread=pool-1-thread-2, counter=10
thread=pool-1-thread-5, counter=11
thread=pool-1-thread-3, counter=12
thread=pool-1-thread-5, counter=13
....
このグローバル変数の並行性やjavaやcの2つが不要な場合は、グローバル変数から値を読み取るだけであれば、並行性について心配する必要はありません。
メソッドがグローバル変数に対してgettersおよびsettersメソッドを実行している場合は、値が変更されます。 – Lokesh
これは、[JNA経由でネイティブライブラリを呼び出す際の同時実行性の問題](https://stackoverflow.com/questions/6983007/concurrency-issue-while-calling-a-native-library-html-html)と重複しています。 via-jna)、間接的に質問に答えて回避策を提供します。これがあなたの質問に答えることに同意しましたか? –
@ErwinBolwidt: - Javaからネイティブへの呼び出しを同期する方法について説明した上記のリンク。しかし、私の場合、ネイティブファイルに存在するグローバル変数について知りたい。 – Prashant