10

我正在尝试为 Android 系统实现本机共享库(.so)。当然,有些代码块需要是线程安全的。

我在这里发现不支持 pthread 锁、互斥锁或条件变量。

我想知道在库级别通常使用什么来实现线程安全?

4

3 回答 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 回答