Singleton (Zugriff auf Objekte)

Peregrin

Mitglied
Hallo

ich arbeite momentan mit Struts und bin am experimentieren. Ich habe ein Objekt worauf viele personen zugreifen können. Und auch abändern können. Leider soll es so sein das, das nur einer auf das Objekt zugrifen kann und ein anderer user nicht. Kann ich das mit einem Singleton Pattern konstruieren ?!

Und wo muss ich das dann reinschreiben
 
Wie greifen denn deine Personen auf dieses Objekt zu? Das Singleton Pattern sorgt lediglich dafür, dasses innerhalb eines Threads nur eine Instanz der Singletonklasse gibt.

Was heißt "kann auf das Objekt zugreifen"? Prinzipiell kann jeder, der eine Referenz auf das Objekt bekommt auch darauf zugreifen. Du könntest natürlich in einer getInstance() Methode prüfen, ob das die zurückzugebende Instanz "gerade benutzt wird". "Gerade benutzt" implementierst du dann in einer Membervariable des zurückzugebenden Objektes selbst.

Irgendwie klingt das, was du da vorhast schon ein wenig komisch ;) Oder geht es dir um Security?

Gruß
Ollie
 
Jo geht um Security, will halt nicht das jemand das Objekt verändert während ein anderer darauf zugreift und das auch verändern will das Objekt. Dann habe ich ja eine inkosistenz drin. Es soll halt nur einer auf das Objekt zugreifen können. Wenn einer es gerade benutzt soll die meldung kommen das dies gerade verwendet wird.

Ich glaube ich habe ein sonnenstich, ich hoffe das war jetzt irgendwie verständlich. Habe mich heute mal durchgelesen dachte das könnte man mit dem singleton pattern erreichen.
 
Also doch keine Security ;) (zumindest hat das, was du da schilderst nichts mit Security zu tun. Es geht ja nicht darum, dass ein User ein Objekt nicht ändern darf, sondern nur darum, dass grad ein paralleler Zugriff stattfindet). Was du da schilderst ist ein bekanntes Problem aus der Datenbankwelt. Google mal nach Pessimistic Locking bzw. Optimistic Locking. Das sind die zwei Verfahren mit denen man sowas begegnet.

Gruß
Ollie
 
Also das Optimistic Locking habe ich mittlerweile realisiert bekommen, aber wie realisiert man denn ein Pessimistic Lockinbg. Wo muss ich enn da ansetzen
 
Naja optimistic locking verlässt sich ja mehr oder minder darauf, dass sowas nicht passiert. Wenn es passiert fliegt halt die Exception. Beim pessimistic locking gehst du explizit davon aus, dass sowas passiert und machst vor einem manipulierenden Zugriff ein Lock auf die Tabellenzeile bzw. auf die komplette Tabelle.

Gruß
Ollie
 
So Problem habe ich freitag gelöst gehabt :) Ein bisschen anders als geplant aber sogar ein Singleton verwendet :suspekt:.

Ich habe mir ein Accessmanager mit einer Hashtable gebaut, in dieser Hashtable die nur einmal erzeugt wird, wird gespeichert, ob ein Objekt verwendet wird und die Session eines Benutzers. Sobald ein Objekt darin steht ist es einen anderem Benutzer nicht mehr möglich, auf die Seite zu klicken wo man das Objekt ebarbeiten kann. Es folgt eine Meldung das dieses Objekt gerade verwendet wird.

Ich finde die Lösung kann sich sehen lassen. Sollte trotzdem mal was schiefgehen greift noch das Optimistic Locking.
 
Hallo,

Das Singleton Pattern sorgt lediglich dafür, dasses innerhalb eines Threads nur eine Instanz der Singletonklasse gibt.
Das wäre dann aber ein ThreadLocalSingleton ;-) Nach Definition des "normalen" Singleton Patterns soll es für die Verwender dieser Komponente im ganzen System (oder innerhalb eines bestimmten Sichtbarkeitsbereichs, Scopes) nur eine einzige Instanz geben. "Normale" Singletons (privater Constructor, statische Instanzmember das das Singleton hält) sind in Java jedoch abhängig vom ClassLoader. Sprich ein Singleton nach diesem Muster kann in einem System mit mehreren ClassLoadern auch mehrfach vorkommen. Wenn man "richtige" Singleton haben möchte muss man diese schon von einem Container verwalten lassen (beispielsweise Spring) oder sich selbst entsprechende Singleton-Strategien ausdenken ( Lock File, Socket, etc...)

Hier mal ein Beispiel wie man mit zwei unterschiedlichen ClassLoadern auch zwei unterschiedliche Singleton Instanzen bekommt:

Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author Thomas.Darimont
 * 
 */
public class ProblematicSingletonExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ClassLoader classLoaderA = new URLClassLoader(
                new URL[] { new File(
                        "C:/Dokumente und Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.training/bin")
                        .toURI().toURL() }, null);

        Class singletonClassA = classLoaderA
                .loadClass("de.tutorials.Singleton");
        System.out.println(singletonClassA.getMethod("getInstance")
                .invoke(null));

        ClassLoader classLoaderB = new URLClassLoader(
                new URL[] { new File(
                        "C:/Dokumente und Einstellungen/Thomas.Darimont/workspace-europa/de.tutorials.training/bin")
                        .toURI().toURL() }, null);
        Class singletonClassB = classLoaderB
                .loadClass("de.tutorials.Singleton");
        System.out.println(singletonClassB.getMethod("getInstance")
                .invoke(null));
    }
}

Java:
/**
 * 
 */
package de.tutorials;

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton(){
        
    }
    
    public static Singleton getInstance() {
        return instance;
    }
}

Ausgabe:
Java:
de.tutorials.Singleton@42e816
de.tutorials.Singleton@a90653

Gruß Tom
 

Neue Beiträge

Zurück