[英]Synchronized methods and static variable access JAVA / ANDROID
我需要一些JAVA理論的幫助......
所以我最近發現,如果一個應用程序使用多個線程,並且不同線程有可能同時訪問同一個共享變量,那么應該使用“synchronized”方法來獲取/設置所述變量。
所以...在我的(位置感知)應用程序中,我有變量LAT和屬於MainActivity的LON並且是靜態的。 可以從后台服務訪問它們,如下所示:
appendToPOST(MainActivity.LAT);
在MainActivity本身,我正在使用谷歌播放位置服務,因此在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方法,即使它與變量存在於同一個類中?
首先, synchronized static methods
是Java內置鎖的類型。 它們使用類對象作為鎖,因此一次只有一個線程可以使用該類。 如果一個線程執行其中一個方法,則其他線程無法執行任何對象方法。 這是鎖定類型的同步。 它會影響性能。 但如果不需要高性能,此解決方案將起作用。 您需要使用synchronized
關鍵字讀取/更改數據的標記方法。
其次,我假設你的變量意味着位置坐標:緯度和經度。 如果是這樣,則必須一起訪問它們。 您可以創建新的復合類。 如果不同時訪問它們,則可能導致競爭狀況。
PS:如果同步影響性能,請告訴我們。 在類級解決方案中存在非鎖定。
到目前為止,您的更改是正確的 正如您已經提到的,對這些共享狀態變量的每次訪問(本地訪問)都必須使用同步訪問器。
此外,如果LAT
和LON
的值屬於一起(我假設您表示具有這些值的位置),則應確保它們不能彼此獨立地修改或檢索。 那就是你不應該為每個值添加一個setter和getter,而是為兩者添加一個。 如果這些值屬於一起,你可以考慮引入一個代表兩個值的新類
public class Location {
private double mLon;
private double mLat;
// Add getters and setters. These don't need to be synchronized
}
並將MainActivity
的同步訪問器更改為
public static synchronized setLocation(final Location inLocation) {
...
}
為了完整性,使用synchronized
塊可能是在共享狀態對象上實現線程同步的最常見但不是最有效的解決方案。 如果涉及到性能,你應該看一下java.util.concurrent
的類。 請參閱此處以獲取Lock
對象的簡短介紹。
更新 :
使用代碼示例更新了答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.