我正在尝试为Android系统实现本机共享库(.so)。当然,有些代码块需要是线程安全的。
我发现here不支持pthreads锁,互斥锁或条件变量。
我想知道图书馆级别通常使用什么来实现线程安全性?
答案 0 :(得分:4)
如何实现这一点取决于您是否只希望它在Java级别线程访问时是线程安全的,或者您需要将本机线程与Java线程同步。
只有两种方法可以同步Java级别线程:
1.最简单的方法是将 synchronized 关键字添加到多线程访问的本机方法中,即
public native synchronized int sharedAccess();
2.来自原生方的同步:
(*env)->MonitorEnter(env, obj);
... /* synchronized block */
(*env)->MonitorExit(env, obj);
请参阅here,了解如何将本机线程与Java线程同步
答案 1 :(得分:1)
有一个DevBytes视频here,讨论NDK中的线程。视频中讨论的一个有用模式是使用本机代码中的__atomic_swap
进行原子写入。
答案 2 :(得分:0)
您可以使用线程安全单例。虽然这不再是一种非常流行的线程安全原子操作方法,但由于所有单例都不好,所以(所以我不期待很多投票)。它速度快,重量轻,而且仍然可以工作,它在Java中被大量使用,并且被认为是一种关键的设计模式。
public class ThreadSafeSingleton {
private static final Object instance = new Object();
protected ThreadSafeSingleton() {
}
// Runtime initialization
public static Object getInstance() {
return instance;
}
}
这是一个懒惰的加载版本......
public class LazySingleton {
private Singleton() {
}
private static class LazyInstance {
private static final Singleton INSTANCE = new Singleton();
}
// Automatically ThreadSafe
public static Singleton getInstance() {
return LazyInstance.INSTANCE;
}
}
您可以在Thread Safe Singletons in Java查看此信息以获取更多信息。