2016-05-24 13 views
1

ich mit einigen JAVA Theorie Hilfe benötigen ...Synchronisierte Methoden und statischen Variablen Zugriff JAVA/ANDROID

So, dass ich vor kurzem entdeckt, wenn eine App verwendet mehrere Threads, und es gibt eine Möglichkeit, von verschiedenen Threads den gleichen gemeinsamen Zugriff Variable zur gleichen Zeit, dann sollte man "synchronisierte" Methoden verwenden, um die Variable zu erhalten/setzen.

Also ... in meiner App (Location Aware) habe ich Variablen LAT und LON, die zu MainActivity gehören und statisch sind. Sie werden aus Hintergrunddienste zugegriffen wie so:

appendToPOST(MainActivity.LAT); 

Und in MainActivity selbst, ich bin mit Google Play Ortungsdienste und so in der OnLocationChanged() Callback-Methode in MainActivity, ich habe:

LAT = [arbitrary Double value goes here]; 
So also

, bedeutet, dass ich umsetzen sollte:

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; 

} 

Richtige? Danke für jede Klärung/Hilfe.

Hinzugefügt: Sollte ich den Code in der onLocationChanged() - Methode ändern, um die synchronisierten Methoden zu verwenden, obwohl es in derselben Klasse wie die Variable existiert?

+0

in der grundlegenden Weise sind Sie richtig, aber 'multitThreading' haben großes Thema, da Sie "synchronisierte" Methoden in Ihrem Fall haben (alle Methoden), den Sie in [DeadLock] (http://www.javaworld.com /article/2075692/java-concurrency/avoid-synchronization-deadlocks.html) – Hosseini

+0

@Hosseini-Deadlocks sollten im angegebenen Beispiel kein Problem darstellen, da es nur ein Sperrobjekt namens 'MainActivity' gibt. Entweder ein Thread enthält dieses Sperrobjekt oder nicht. Wenn es jedoch andere Klassen gibt, die die Synchronisation auch mit anderen Sperrobjekten verwenden, sind Deadlocks definitiv eine wichtige zu beachtende Sache. Als Faustregel kann man sagen: Wenn Ihr Code mehrere verschiedene Sperrobjekte verwendet, müssen diese Objekte ** immer ** in der gleichen Reihenfolge akquiriert werden. Leider ist es nicht immer so einfach, diese Regel zu erfüllen ... – dpr

+0

Wir sehen hier keine Sache anstelle von 'Getter/Setter', wir sagen nur, das ist nicht jedes Mal, wenn wir" State "schützen müssen synchronisiert ". – Hosseini

Antwort

1

Ihre Änderung ist soweit korrekt. Und wie Sie bereits erwähnt alle Zugriff (auch lokalen Zugriff) auf diese gemeinsamen Statusvariablen müssen die synchronisierten Accessoren verwenden. Wenn die Werte LAT und LON zusammengehören (ich nehme an, Sie repräsentieren einen Standort mit diesen Werten), sollten Sie sicherstellen, dass sie nicht unabhängig voneinander geändert oder abgerufen werden können. Das heißt, Sie sollten für jeden Wert außer einem für beide keinen Setter und Getter hinzufügen. Und wenn diese Werte gehören zusammen könnten Sie denken, eine neue Klasse einzuführen, die beide Werte wie

repräsentiert
public class Location { 
    private double mLon; 
    private double mLat; 

    // Add getters and setters. These don't need to be synchronized 
} 

und ändern Sie die synchronisierten Accessoren in MainActivity zu

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

Nur der Vollständigkeit halber synchronized Blöcke verwendet, wird wahrscheinlich die am häufigsten, aber nicht die effizienteste Lösung zum Implementieren der Thread-Synchronisierung für Objekte mit gemeinsam genutztem Status. Wenn es um Leistung geht, sollten Sie sich die Klassen in java.util.concurrent ansehen. Eine kurze Einführung in das Objekt Lock finden Sie unter here.

UPDATE:
aktualisiert Antwort mit Codebeispiel

2

Zuerst synchronized static methods sind Art von Java-internen Sperren. Sie verwenden das Klassenobjekt als Sperre, sodass nur jeweils ein Thread mit der Klasse arbeiten kann. Wenn ein Thread eine der Methoden ausführt, können andere Threads keine der Methoden des Objekts ausführen. Dies ist die Art der Synchronisierung. Es beeinflusst die Leistung. Wenn jedoch keine hohe Leistung erforderlich ist, funktioniert diese Lösung. Sie benötigen Markierungsmethoden, die Daten mit dem Schlüsselwort synchronized lesen/ändern.

Zweitens nehme ich an, dass Ihre Variablen Koordinaten des Standortes bedeuten: Breite und Länge. Wenn ja, müssen sie zusammen zugegriffen werden. Sie können eine neue zusammengesetzte Klasse erstellen.Wenn sie nicht gleichzeitig abgerufen werden, kann dies zu einem Race-Zustand führen.

PS: Lassen Sie uns wissen, ob die Synchronisation die Leistung beeinträchtigt. Es gibt auf Klassenebene keine Locking-Lösungen.

Verwandte Themen