Show Menu
Cheatography

Java Memory Model Cheat Sheet (DRAFT) by

Dinge die ein Java Programmierer wissen sollte aber meist vergisst

This is a draft cheat sheet. It is a work in progress and is not finished yet.

Volatile Variablen

1. Vor jeder Auswertung der Variable (Laden) wird ihr aktueller Wert aus dem Haupts­peicher in den lokalen Thread Speicher geholt (gelesen).
2. Nach jeder Zuweisung (Speic­hern) wird ihr aktueller Wert aus dem lokalen Thread Speicher in den Haupts­peicher geschr­ieben.
3. Volatile Variablen werden in genau der Reihen­folge geschr­ieben oder gelesen wie vom Thread angefo­rdert.
4. Die Lese- und Schrei­bzu­griffe sind immer atomar (auch bei double und long -64 bit Werten- bei denen das sonst nicht so ist).

Singleton - unsichere Initia­lis­ierung

Diese Implementierung hat folgende Besonderheiten:
[1] Theoretisch funktioniert sie nicht - in der Praxis taugt sie aber als Signleton (siehe dazu folgende Diskussion)
[2] Man darf sich hier bei Zugriff nicht auf ein korrekt initialisiertes Signleton verlassen, da im konkreten Fall auf Grund des Memory Modelles keine Annahmen darüber zugelassen sind wann die Felder des erzeugten Singleton wirklich alle korrekt befüllt und für jeden Thread konsistent lesbar sind.

public class Resource{
 private static Resource singleton;
public static Resource createInstance(){
   if(singleton==null){                                  //erster Test
    synchronized(Resource.class){
      if(singleton==null){                              //zweiter Test
         singleton=new Resource();
      } //endif
     } // end sync
   }// endif
 return singleton; 
 }
}

Singleton - korrekte Intial­isi­erung

private static volatile Resource resource;
private static volatile Resource singleton;
public static Resource createInstance(){
 if(resource==null){
  synchronized(Resource.class){
   if(singleton==null){
       singleton=new Resource();
   }
  }
  resource=singleton;
 }
 return resource;
}