【问题标题】:Thread safety in Android librariesAndroid 库中的线程安全
【发布时间】:2014-11-04 16:23:54
【问题描述】:

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

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

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

【问题讨论】:

  • 恐怕你误解了这篇文章。 pthreads 的 Android 仿生实现相当完整。它不完全符合 POSIX,但适用于所有实际目的。 “不支持”的互斥锁和条件变量是 进程间 的,它们与您的本机共享库无关,在沙盒 Android 应用程序中工作。 Android 定义了其他进程间通信和同步机制。

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


【解决方案1】:

如何实现这取决于您是希望它在被 Java 级线程访问时是线程安全的,还是需要将本机线程与 Java 线程同步。

有两种方法可以只同步 Java 级别的线程:

1.最简单的方法是在多线程访问的native方法中加入synchronized关键字,即

public native synchronized int sharedAccess();

2.从native端同步:

(*env)->MonitorEnter(env, obj);
...                      /* synchronized block */
(*env)->MonitorExit(env, obj);

请参阅here,了解如何将本机线程与 Java 线程同步

【讨论】:

    【解决方案2】:

    有一个 DevBytes 视频here 讨论了 NDK 中的线程。视频中讨论的一种有用模式是在本机代码中使用 __atomic_swap 进行原子写入。

    【讨论】:

      【解决方案3】:

      您可以使用线程安全的单例。虽然这不再是一种非常流行的线程安全原子操作方法,因为单例的所有东西都是不好的,(所以我不希望有很多赞成票)。它快速、轻量并且仍然有效,它在 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;
          }
      }
      

      您可以在Thread Safe Singletons in Java 上查看此帖子以获取更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多