Android库中的线程安全性

时间:2014-09-10 21:18:18

标签: android thread-safety shared-libraries android-library bionic

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

我发现here不支持pthreads锁,互斥锁或条件变量。

我想知道图书馆级别通常使用什么来实现线程安全性?

3 个答案:

答案 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查看此信息以获取更多信息。