以下情况设计不佳还是我忽略了重要的事情?
这是代码
public class MainActivity extends AppCompatActivity … {
…
@Override
public void onCreate(Bundle savedInstanceState){
…
buildGoogleApiClient();
}
/**
* Builds a GoogleApiClient. Uses the addApi() method to request the LocationServices API.
*/
protected synchronized void buildGoogleApiClient() {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
}
为什么buildGoogleApiClient
synchronized
只能从onCreate
内部调用?
我知道它不会受到伤害,但这不是问题的关键。我需要知道的是:为什么有必要?
修改
答案 0 :(得分:3)
在这种情况下,synchronized
将在调用期间锁定对象。如果还有其他方法也声明了synchronized
,那么在任何给定时间只会执行其中一个方法。例如,如果从另一个线程上的synchronized方法访问mGoogleApiClient
,则同步将确保另一个线程看到完全构造的对象或空引用。
即使这样,你仍然可以证明它是一个糟糕的实现。更好的方法是让每个方法在私有对象上同步,这样类外的代码就不会无意中锁定对象并导致意外行为。 OTOH,可以说synchronized
方法对于示例来说更好,因为代码行更少,并且同步适用于整个方法。
在这种特殊情况下,volatile
可能有效,但我不确定如何使用构建器模式。
无论如何,您需要了解有关...
部分代码的更多信息,以了解是否需要进行同步。