Android 线程安全方法

在一些情况下,你所实现的方法有可能会被多于一个的线程所调用,所以它们必须被写成线程安全的。

对于我们上一节所讨论的RPC 机制中的可以被远程调用的方法来说,这是必须首先考虑的。如果针对一个IBinder 对象中实现的方法的调用源自这个IBinder 对象所在的进程时,这个方法将会在调用者的线程中执行。

然而,如果这个调用源自其它的进程,则这个方法将会在一个线程池中选出的线程中运行,这个线程池由Android 加以管理,并与IBinder 存在于同一进程内;这个方法不会在进程的主线程内执行。

反过来说,一个服务的onBind() 方法应为服务进程的主线程所调用,而实现了由onBind() 返回的对象(比如说,一个实现了RPC 方法的Stub 的子类)的方法将为池中的线程所调用。因为服务可以拥有多于一个的客户端,而同一时间,也会有多个池中的线程调用同一个 Binder 方法。

因此IBinder 方法必须实现为线程安全的。

类似的,一个内容提供者能接受源自其它进程的请求数据。尽管ContentResolver 和ContentProvider 类隐藏了交互沟通过程的管理细节,ContentProvider 会由query(), insert(), delete(), update() 和getType()方法来相应这些请求,而这些方法也都是由那个内容提供者的进程中所包涵的线程池提供的,而不是进程的主线程本身。所以这些有可能在同一时间被很多线程调用的方法也必须被实现为线程安全的。