线程安全通过上下文对象的同步getter

时间:2015-10-19 15:17:36

标签: java multithreading thread-safety

我需要使用他们的SDK访问API。

访问(以及我需要访问的任何内容)需要使用上下文对象。同一个。

Context context;

它运行的可能性(确定)多个线程将访问同一个上下文对象以执行各种操作(通过' context'对象)

那么,Thread-Safety所需要的只是通过synchronized getter()来引用它吗?

实施例

getContext().someOperation()
getContext().anotherOperation()

定义:

public synchronized Context getContext() { return context; }

2 个答案:

答案 0 :(得分:2)

不,只能在getter上进行同步不是一种选择。有两种可能性:

  • Context对象是线程安全的,在这种情况下,您根本不需要同步任何内容。

  • Context对象不是线程安全的,在这种情况下,getter和触及它的任何其他东西都必须在同一个锁上同步。

您应该阅读API并查看该对象是否实际上是线程安全的,通常使用需要共享此类内容的API,这只是从API提供商的角度来看保护的唯一意义来自并发变化。

假设文档不充分(这是典型的),从实施者的角度推断规范可能是有用的。在这种情况下,如果API需要同步,那么您要同步的锁是什么? 要使同步工作,您需要一个共享锁。通常,容器比处理客户端更容易处理这种问题。

答案 1 :(得分:1)

synchronized关键字指向方法的范围。所以只有那种方法是线程安全的。

即,一次只能由一个线程调用该方法(每个实例,当然因为该方法是实例方法)。

要使上下文线程安全,对它的任何操作都需要在synchronized块或方法中进行(当然,除非Context对象的操作已经是线程安全的)。