我正在尝试为 Android 系统实现本机共享库(.so)。当然,有些代码块需要是线程安全的。
我在这里发现不支持 pthread 锁、互斥锁或条件变量。
我想知道在库级别通常使用什么来实现线程安全?
问问题
596 次
3 回答
4
如何实现这取决于您是希望它在被 Java 级线程访问时是线程安全的,还是需要将本机线程与 Java 线程同步。
有两种方法可以仅同步 Java 级别的线程:
1.最简单的方法是在多线程访问的native方法中加入synchronized关键字,即
public native synchronized int sharedAccess();
2.从native端同步:
(*env)->MonitorEnter(env, obj);
... /* synchronized block */
(*env)->MonitorExit(env, obj);
请参阅此处了解如何将本机线程与 Java 线程同步
于 2015-08-30T05:45:41.300 回答
1
这里有一个 DevBytes 视频,讨论了 NDK 中的线程。__atomic_swap
视频中讨论的一种有用模式是在本机代码中进行原子写入。
于 2015-09-04T13:06:03.740 回答
0
您可以使用线程安全的单例。虽然这不再是一种非常流行的线程安全原子操作方法,因为单例的所有东西都是坏的,(所以我不希望有很多赞成票)。它快速、轻量并且仍然有效,它在 smalltalk 和 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;
}
}
您可以查看这篇关于Java 中的线程安全单例的帖子以获取更多信息。
于 2015-09-05T00:29:32.870 回答