同步方法和静态变量访问JAVA/ANDROID



我需要一些JAVA理论方面的帮助。。。

因此,我最近发现,如果一个应用程序使用多个线程,并且不同线程有可能同时访问同一共享变量,那么应该使用"同步"方法来获取/设置所述变量。

所以。。。在我的(位置感知)应用程序中,我有属于MainActivity的变量LAT和LON,它们是静态的。它们是从后台服务访问的,比如:

appendToPOST(MainActivity.LAT);

在MainActivity中,我使用的是google play定位服务,因此在MainActivity的onLocationChanged()回调方法中,我有:

LAT = [arbitrary Double value goes here];

因此,这意味着我应该实现:

public static synchronized void setLAT(Double inLAT){
LAT = inLAT;
}
public static synchronized void setLON(Double inLON){
LON = inLON;
}
public static synchronized Double getLAT(){
return LAT;
}
public static synchronized Double getLON(){
return LON;
}

正确吗?感谢您的澄清/帮助。

添加:此外,我是否应该更改onLocationChanged()方法中的代码以使用同步的方法,即使它与变量存在于同一个类中?

首先,synchronized static methods是Java内置锁的类型。它们使用类对象作为锁,因此一次只能有一个线程使用该类。如果一个线程执行其中一个方法,则其他线程无法执行任何对象方法。这是锁定类型的同步。它会影响性能。但是,如果不需要高性能,此解决方案将起作用。您需要使用synchronized关键字标记读取/更改数据的方法。

其次,我假设你的变量是指位置的坐标:纬度和经度。如果是,则必须一起访问它们。您可以创建新的复合类。如果不同时访问它们,可能会导致竞争状况。

PS:让我们知道同步是否会影响性能。存在类级别的非锁定解决方案。

到目前为止,您的更改是正确的。正如您已经提到的,对这些共享状态变量的每次访问(以及本地访问)都必须使用同步访问器。

此外,如果LATLON的值属于一起(我假设您用这些值表示一个位置),则应确保它们不能相互独立地进行修改或检索。也就是说,不应该为每个值添加setter和getter,而应该为两者添加一个。如果这些值属于一起,你可以考虑引入一个新的类来表示这两个值,比如

public class Location {
private double mLon;
private double mLat;
// Add getters and setters. These don't need to be synchronized
}

并将CCD_ 5中的同步访问者更改为

public static synchronized setLocation(final Location inLocation) {
...
}

为了完整起见,使用synchronized块可能是在共享状态对象上实现线程同步的最常见但不是最有效的解决方案。如果谈到性能,您可能应该看看java.util.concurrent中的类。有关Lock对象的简短介绍,请参见此处。

更新
使用代码示例更新答案

最新更新