我需要使用他们的SDK访问API。
访问(以及我需要访问的任何内容)需要使用上下文对象。同一个。
Context context;
它运行的可能性(确定)多个线程将访问同一个上下文对象以执行各种操作(通过' context'对象)
那么,Thread-Safety所需要的只是通过synchronized getter()
来引用它吗?
getContext().someOperation()
getContext().anotherOperation()
public synchronized Context getContext() { return context; }
答案 0 :(得分:2)
不,只能在getter上进行同步不是一种选择。有两种可能性:
Context对象是线程安全的,在这种情况下,您根本不需要同步任何内容。
Context对象不是线程安全的,在这种情况下,getter和触及它的任何其他东西都必须在同一个锁上同步。
您应该阅读API并查看该对象是否实际上是线程安全的,通常使用需要共享此类内容的API,这只是从API提供商的角度来看保护的唯一意义来自并发变化。
假设文档不充分(这是典型的),从实施者的角度推断规范可能是有用的。在这种情况下,如果API需要同步,那么您要同步的锁是什么? 要使同步工作,您需要一个共享锁。通常,容器比处理客户端更容易处理这种问题。
答案 1 :(得分:1)
synchronized关键字指向方法的范围。所以只有那种方法是线程安全的。
即,一次只能由一个线程调用该方法(每个实例,当然因为该方法是实例方法)。
要使上下文线程安全,对它的任何操作都需要在synchronized块或方法中进行(当然,除非Context对象的操作已经是线程安全的)。