Schreibzugriff bei jedem Überschreiben?

Passiert ein Schreibzugriff im Speicher, wenn ich eine Variable mit dem gleichen Wert überschreibe?

  • Ja, wer Schreibzugriffe minimieren will muss mit einer if Abfrage diesen fall ausschließen.

    Stimmen: 0 0,0%
  • Nein, Java macht das automatisch.

    Stimmen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    0

Tarrew

Top Contributor
Ich hab mal mit einem kleinen Beispiel ausprobiert (Java: 1.8.0_121):
Java:
    public static void main(String[] args) {

        int a = 5;
        int b = 5;

        for(int i=0; i<10000; i++) {
            a = b;
        }
      
        System.out.println(a);
    }

Daraus macht die JVM erstmal folgenden Bytecode:
Code:
         0: iconst_5
         1: istore_1
         2: iconst_5
         3: istore_2
         4: iconst_0
         5: istore_3
         6: iload_3
         7: sipush        10000
        10: if_icmpge     21
        13: iload_2
        14: istore_1
        15: iinc          3, 1
        18: goto          6
        21: getstatic     #2               
        24: iload_1
        25: invokevirtual #3                
        28: return

Zeile 13 und 14 sind hier interessant: Die Variable im Speicher wird jedes Mal überschrieben.


Wenn man das ganze leicht ändert:
Java:
    public static void main(String[] args) {
        for (int i = 0; i < 1000000; i++) {
           doSomeStuff();
        }
    }

    public static int doSomeStuff() {
        int a = 5;
        int b = 5;

        a = b;

        return a;
    }

und sich anguckt, was die JVM in Assembler daraus macht:
Code:
  # {method} {0x000000001b8c0310} 'doSomeStuff' '()I' in 'Main'
  #           [sp+0x40]  (sp of caller)
  0x0000000004ab5f60: mov     dword ptr [rsp+0ffffffffffffa000h],eax
  0x0000000004ab5f67: push    rbp
  0x0000000004ab5f68: sub     rsp,30h           ;*iconst_5
                                                ; - Main::doSomeStuff@0 (line 13)

  0x0000000004ab5f6c: mov     eax,5h
  0x0000000004ab5f71: add     rsp,30h
  0x0000000004ab5f75: pop     rbp
  0x0000000004ab5f76: test    dword ptr [5e0100h],eax  ;   {poll_return}
  0x0000000004ab5f7c: ret
  0x0000000004ab5f7d: nop
  0x0000000004ab5f7e: nop
  0x0000000004ab5f7f: mov     rax,qword ptr [r15+2a8h]
  0x0000000004ab5f86: mov     r10,0h
  0x0000000004ab5f90: mov     qword ptr [r15+2a8h],r10
  0x0000000004ab5f97: mov     r10,0h
  0x0000000004ab5fa1: mov     qword ptr [r15+2b0h],r10
  0x0000000004ab5fa8: add     rsp,30h
  0x0000000004ab5fac: pop     rbp
  0x0000000004ab5fad: jmp     4a0cae0h          ;   {runtime_call}
  0x0000000004ab5fb2: hlt
  0x0000000004ab5fb3: hlt
  0x0000000004ab5fb4: hlt
  0x0000000004ab5fb5: hlt
  0x0000000004ab5fb6: hlt
  0x0000000004ab5fb7: hlt
  0x0000000004ab5fb8: hlt
  0x0000000004ab5fb9: hlt
  0x0000000004ab5fba: hlt
  0x0000000004ab5fbb: hlt
  0x0000000004ab5fbc: hlt
  0x0000000004ab5fbd: hlt
  0x0000000004ab5fbe: hlt
  0x0000000004ab5fbf: hlt

dann sieht man auch, dass die JVM quasi die ganze Methode wegoptimiert hat, weil halt nichts drin passiert. Ist natürlich jetzt ein sehr gestellter Fall, aber wenn wenn dein Code sehr oft aufgerufen wird und die JVM den Bytecode wirklich fest in Assembler Code übersetzen sollte, dann kann man idR schon davon ausgehen, dass solche simplen statischen Sachen wegoptimiert werden. Auch wenn man natürlich nicht mit dem Vorsatz programmieren sollte, dass die JVM schon alles wegoptimiert ;).

Sachen wie:
Java:
    public static int doSomeStuff(int i) {
        int a = 1;
        int b = i % 2;

        a = b;

        return a+b;
    }
wurden auch optimiert, die Zuweisung findet also nicht nochmal statt. Aber verlassen sollte man sich natürlich nicht drauf, wobei so simple Zuweisungen ja ohnehin mehr oder weniger nicht messbar sind.
 

mrBrown

Super-Moderator
Mitarbeiter
Interessant wirds allerdings erst, wenn's keine lokalen Variablen mehr sind ;)

Da wären (volatile) static und Instanz-Variablen deutlich interessanter

Auch wenn man natürlich nicht mit dem Vorsatz programmieren sollte, dass die JVM schon alles wegoptimiert ;).
Brian Goetz hat gesagt.:
Often, the way to write fast code in Java applications is to write dumb code -- code that is straightforward, clean, and follows the most obvious object-oriented principles
;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Mit jedem Wert in der for-Schleife weiter arbeiten Java Basics - Anfänger-Themen 3
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
G Javafx Eventhandler zu jedem Node Java Basics - Anfänger-Themen 1
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
V Attribut aus aus jedem ArrayListen index auf Bildschirm ausgeben Java Basics - Anfänger-Themen 9
K Exception nur im "Debug"-Modus und jedem 3.-5. mal Ausführen Java Basics - Anfänger-Themen 3
M ArrayList || Bei Ausgabe nach jedem 10. Eintrag Zeilenumbruch Java Basics - Anfänger-Themen 7
D Ermitteln des kleinsten Messwertes von jedem Tag Java Basics - Anfänger-Themen 15
S Methode an jedem 1. des Monats ausführen? Java Basics - Anfänger-Themen 8
B .jar Datei von jedem Computer ausführen? Java Basics - Anfänger-Themen 22
J Array: Jedem Element direkt denselben Wert zuweisen Java Basics - Anfänger-Themen 6
S String: jedes Element mit jedem Java Basics - Anfänger-Themen 31
G Wie ändere ich eine Variable in jedem Schleifendurchlauf? Java Basics - Anfänger-Themen 15
M Kompiliert Eclipse bei jedem Speichern neu? Java Basics - Anfänger-Themen 7
S neuer String zur jedem Teil von List Java Basics - Anfänger-Themen 2
G jedem while element eine maximale rechenzeit zusichern Java Basics - Anfänger-Themen 16
megachucky Wie vergebe ich jedem eine Kundennummer. Java Basics - Anfänger-Themen 6
G StringTokenizer - jedem Zeichen einen Bezeichner zuweisen Java Basics - Anfänger-Themen 4
P String zu Date bei jedem Tastendruck parsen Java Basics - Anfänger-Themen 3
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
B Überschreiben und Überladen Java Basics - Anfänger-Themen 8
B Überschreiben und verdecken Java Basics - Anfänger-Themen 1
O Überschreiben/Überladen Methode Java Basics - Anfänger-Themen 6
C Überschreiben von Methoden Java Basics - Anfänger-Themen 3
H Polymorphismus-Überschreiben Java Basics - Anfänger-Themen 1
F Überschreiben nach einer Vererbung Java Basics - Anfänger-Themen 2
A HashCode Überschreiben Java Basics - Anfänger-Themen 2
K Überschreiben einer "super.super"-Methode Java Basics - Anfänger-Themen 6
K Überschreiben und Überladen Java Basics - Anfänger-Themen 3
M Überschreiben von JPanels funktioniert nicht! Java Basics - Anfänger-Themen 9
buntuswalus OOP Überschreiben von Eigenschaften Java Basics - Anfänger-Themen 8
T Polymorphie:Überschreiben der Methode klappt nicht Java Basics - Anfänger-Themen 4
K Überladen und Überschreiben von Methoden Java Basics - Anfänger-Themen 3
0 Überschreiben von pai*tBackground() Java Basics - Anfänger-Themen 2
G Überschreiben einer Variable umgehen Java Basics - Anfänger-Themen 6
G Überschreiben von Methoden beim Casting Java Basics - Anfänger-Themen 7
O Überschreiben erzwingen Java Basics - Anfänger-Themen 6
W Überschreiben von Elternklasse Java Basics - Anfänger-Themen 15
M JFileChooser Überschreiben Dialog? Java Basics - Anfänger-Themen 2
G Frage zum Überschreiben einer Klasse Java Basics - Anfänger-Themen 6
W Überschreiben und Methodenaufruf Java Basics - Anfänger-Themen 3
D Überschreiben Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben