# Synchronized Problem



## theawak3r (16. Sep 2012)

Ich bearbeite grad alte Klausuren, als Vorbereitung auf meine eigene und bin auf eine Frage gestoßen, die ich nicht beantworten kann. Ich hoffe mir kann jemand irgendwie weiterhelfen:







Letztenendes muss es dabei ja um konkurrierende Zugriffe auf ein Objekt gehen. Mir fällt allerdings kein sinnvolles Beispiel ein, um dies zu verdeutlichen...


----------



## SlaterB (17. Sep 2012)

der Punkt ist hier dass ein Einzelnutzer quasi von Anfang bis Programmende Exklusivzugriff hat,
während Mehrbenutzer sich abwechseln, zwangläufig Lücken entstehen

jemand könnte

```
if (!list.isEmpty()) {
  list.get(0);
}
```
aufrufen, die synchronisierte Methode isEmpty() liefert wahrheitsgemäßg, dass die Liste nicht leer ist,
bis zum sicheren get-Aufruf besteht aber Luft im Code, da könnte ein anderer Thread das letzte Element wegschnappen,
dann gibts ein schönes Schlamassel, wie es ein Einzelnutzer mit diesem typischen Code nicht hinbekäme


----------



## theawak3r (17. Sep 2012)

Danke schonmal. Allerdings sind laut Aufgabenstellung alle Methoden synchronized. Demnach, wäre die Methode, aus der dein Codeausschnitt stammt, auch synchronzied. Somit kann es zu dem von dir angesprochenen Abwechseln nicht kommen.

Dein Beispiel würde nur funktionieren, wenn mindestens eine Methode keinen exklusiven Zugriff hat, in dem es dann zu dem von dir abgesprochenen Abwechseln kommen kann.


----------



## Empire Phoenix (17. Sep 2012)

Irgetwe ist die aufgabe naja s******e formuliert:

a) wie ist mehrbenutzter zu verstehen? Mehrbenutzer lässt sich auch mit programmen mit nur einem Thread hinbekommen. 
b) hat ein benutzer immer einen Thread? oder wie soll das interpretiert werden?
c) Fals ein benutzer mehrere threads hat kann es sein dass du selbst den einbenutzerbetrieb unmöglich machst.
d) Fall das programm nur immutable message passing (vgl funktionale programierung) benutzt ist synchronized vollkommen egal. 

Ich empfehle das script danach durchzusuchen was dein dozent damit wohl gemeint hat.


----------



## theawak3r (17. Sep 2012)

Hmm... Ich kann ja mal etwas weiter ausholen... Also die Veranstaltung nennt sich Informationsinfrastrukturen. Dabei werden Themen behandelt wie die Speicherung von objektorierntierten Modellen in relationale Datenbanken und in diesem Zusammenhang Möglichkeiten zur Abbildung von Spezialisierungsbeziehung in diesen Datenbanken. Und darüber hinaus Persistenz... Transaktionsicherheit... Das sollte für die Aufgabe allerdings uninteressant sein...

Mehrbenutzer ist in diesem Zusammenhang so zu verstehen, dass ich mehrere Anwender habe, die auf in der Datenbank abgelegten Objekten agieren. 

Das Auftreten der Deadlock Problematik ist klar.
Zu zeigen ist nun, dass ob wohl alle Methoden synchronized sind, trotzdem Effekte auftreten können, die ein einzelner Benutzer nicht hervorrufen kann.

Das ist jedenfalls meine Meinung, wie die Aufgabe gelöst werden muss.. Und dabei sollte die relationale DAtenbank oder sonst was un abhängig von sein. Letztenendes geht es hierbei ja ausschließlich um Nebenläufigkeit und Effekte, die dabei auftreten können. DIe Frage ist also, was können 2 Threads mit Klassen, deren Methoden alle Synchronzied sind, annstellen, was ein Thread nicht schafft.


----------



## SlaterB (17. Sep 2012)

> Allerdings sind laut Aufgabenstellung alle Methoden synchronized. Demnach, wäre die Methode, aus der dein Codeausschnitt 
> stammt, auch synchronzied. Somit kann es zu dem von dir angesprochenen Abwechseln nicht kommen.

das dreht sich im Kreis, wenn alles synchronisiert wäre (wie auch immer das zu verstehen wäre), 
hätte man überhaupt keinen Mehrbenutzerbetrieb (abgesehen von Abarbeitung in Reihenfolge), 
es gäbe auch keine Deadlock-Problematik, mindestens das ist ein direkter Widerspruch

alle Methoden könnten auf unterschiedliche Monitor synchronisiert sein, z.B. die run-Methoden der mehreren Threads auf sich selber,
dann kommt mein Beispiel wieder zum Tragen, bezogen auf eine bestimmte Klasse/ ein Objekt, auf welchem mehrere zugreifen,
gibt es das nicht, dann auch kein Deadlock usw.

> Das Auftreten der Deadlock Problematik ist klar.

nenne dafür bitte ein Anwendungsbeispiel, dann konstruiere ich dir einen hier benötigten 'Effekt' daraus


----------



## Marco13 (17. Sep 2012)

Die Formulierung ist wirklich :wuerg: :noe: Doppelte und dreifache Verneinung mit schwammigen Vorbedingungen und impliziten Implikationen, die dann noch widerlegt werden sollen 

Zu zeigen ist, wenn ich das richtig im Kopf überschlagen habe, dass jeder Effekt, der bei mehreren Benutzern auftreten kann, auch mit einem einzelnen Benutzer auftreten kann (sofern ich da nicht auf die Schnelle durch irgendwelche negierten Implikationen was durcheinander geworfen habe). FALLS das so ist, reicht schon diese Klasse, um zu zeigen, dass die Aufgabenstellung nicht erfüllbar ist bzw. von einer falschen Voraussetzung ausgeht: 

```
import java.util.HashSet;
import java.util.Set;

public class BePrecise
{
    private static Set<Thread> set = new HashSet<Thread>();
    public static synchronized void eatThis()
    {
        set.add(Thread.currentThread());
        System.out.println(set.size());
    }
}
```

(Und wenn der Aufgabensteller darauf hin fragt, ob du ihn verar...en willst, antworte mit einem selbstbewußten: "JA, ich will!")


----------



## maki (17. Sep 2012)

*verschoben*


----------



## SlaterB (17. Sep 2012)

@Marco13
du schreibst bewußt eine Spassantwort?

für mich ist die Aufgabe ziemlich klar zu verstehen,
die Aussage "der Mehrbenutzerbetrieb erzeugt keine Effekte, die [Bedingung x]" soll wiederlegt werden,
also mit einem Programmbeispiel gezeigt werden "der Mehrbenutzerbetrieb erzeugt Effekte, die [Bedingung x]"


----------



## theawak3r (17. Sep 2012)

Danke für die Hilfe.. Ich will das ganze mal Auflösen, nachdem ich die Lösung nun von einem Kommilitonen eines höheren Semesters erklärt bekommen habe:

Wir haben ein Counter Objekt, das einen Integer hat. Auf diesem einen Counter Objekt operieren zwei Increment-Objekte. Die Inkrement Objekte habe eine Methode zum erhöhen des Counters (wer hätte das gedacht?!). Dazu holen sie sich den Wert des  Counters via getter, merken sich diesen Wert und addieren zu diesem gemerkten Wert einen beliebigen hinzu. Wenn nun während des Merkens, der Wert von einem anderen Inkrement-Objekt verändert wird, erhält man nach dem eigenen Erhöhen des Counters einen anderen Wert via get, als erwartet. Dies funktioniert auch wenn alle Methoden synchronized sind, da dies keinen Einfluss auf die "zeitgleiche" Abarbeitung einer Methode, wie sie soeben beschroeben wurde, hat.

Ich hoffe das ist vertsändlich genug ausgedrückt.. Ich hab es nun jedenfalls verstanden


----------



## SlaterB (17. Sep 2012)

exakt mein Beispiel, möchte ich behaupten 

zwischen zwei Methodenaufrufen ist Luft, in der andere Threads eingreifen können


----------



## theawak3r (17. Sep 2012)

Ja.. Ich hatte nicht bedacht, dass das Counter Objekt ja nicht während der gesamte Methode gesperrt ist, da diese ja nur lediglich das Inkrement Objekt sperrt... Nun ist es gelöst und hier kann geschlossen werden 

Danke nochmals


----------



## Marco13 (17. Sep 2012)

SlaterB hat gesagt.:


> @Marco13
> du schreibst bewußt eine Spassantwort?
> 
> für mich ist die Aufgabe ziemlich klar zu verstehen,
> ...



Es war keine Spassantwort, und vielleicht gibt es unterschiedliche Auffassungen bestimmter Begriffe (ich will mich nicht zu dem Versuch aufschwingen, das Wort "Präzision" präzise zu definieren  )

Ein Punkt war der Frage, die auch für dich unklar war, nämlich die nach der Granularität der Synchronisation - zwei Threads, die in ihren run's beide ein
synchronized(commonObject) { ... }
stehen haben, werden sich nicht in die Quere kommen. 

Aber auch zur eigentlichen Frage hatte ich tatsächlich kurz überlegt, was die Aufgabenstellung genau bedeutet. 
_"...wenigstens erzeugt der Merhbenutzerbetrieb keine Effekte, die nicht auch ein einzelner Benutzer hervorbringen kann. Widerlegen sie anhand eines instruktiven Beispiels diese Aussage"_

Ich kenne mich mit Logik höherer Stufe nicht so aus, aber hatte dann überlegt dass das vielleicht etwa lauten könnte
M = Mehrbenutzerbetrieb ( !M = Single-Benutzer)
P(e) = Effekt e kann auftreten
forall(e). M -> P(e) & !(!M -> !P(e))
Das kann man dann umformen, ... ... ... 

Ich vermute(!) dass sowas gemeint war wie 

_Zu zeigen: Jeder Effekt, der beim Mehrbenutzerbetrieb auftreten kann, kann auch beim Einzelbenutzerbetrieb auftreten"_

aber sicher bin ich mir da nicht. Wenn die Aufgabenstellung so gelautet hätte, hätte ich gar nicht (oder zurückhaltender und mehr auf die erste Frage bezogen) geantwortet. 




Kritzelzettel
forall(e). M -> P(e) & !(!M -> !P(e))
forall(e). (!M | P(e)) & !(!!M | !P(e))
forall(e). (!M | P(e)) & !M & P(e)
forall(e). (!M & !M & P(e)) | (P(e) & !M & P(e))
forall(e). (!M & P(e)) | (!M & P(e))
forall(e). (!M & P(e))
Ja, müßte hinkommen...: "Für jeden Effekt gilt: Single-Benutzer und der Effekt kann auftreten". Aber man muss es ja nicht drauf anlegen...


----------



## SlaterB (17. Sep 2012)

unklar war es mir erst bei den Nachfrage 'alles ist synchronisiert',
die Aufgabenstellung fand ich ziemlich deutlich und sinnvoll auf einen wichtigen Standard-Lernpunkt ausgerichtet

aber egal, ich habe heute irgendwie den 'Das letzte Wort'-Tag, in mehreren Threads schon 
(und hier in der Antwort von 17:04 bereits)


----------



## Marco13 (17. Sep 2012)

Ich würde ja provozierend sagen: Das hältst du nicht durch 

Aber ... wer legt sich bei sowas schon mit jemandem an, der den Thread _schließen_ kann?


----------



## SlaterB (17. Sep 2012)

ich hab meine 30.000 Post vor deinen 15.000  ,
und jetzt genug gespammt


----------

