Vollständige Version anzeigen : [Java] Synchronized welches Object übergeben?


naz
17.01.2015, 18:26

Hey..

Ich studiere Informatik und habe Probleme mit dem Schlüsselwort synchronized in Java.
Eigentlich habe ich die Theorie verstanden. Wenn ganze Methoden "synchronized" werden, gibt es keine Probleme wenn mehrere Threads gleichzeitig die Methode aufrufen.. aber dann gibt es ja auch noch diese Variante:
...
synchronized(myObject) {
... // innerhalb dieses Blocks besteht die Sperre
}
..;


Warum muss ich denn hier ein Object angeben?

Danke schonmal :)

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Calyx
17.01.2015, 19:36

Hi,

mit einer synchronized Methode lockst du das gesamte Objekt und alle Attribute, sobald ein Thread die Methode aufruft. Den selben Effekt hätte das:

public void doSomething() {
synchronized(this) {
...
}
}


Mit einem synchronized statement lockst du nur das übergebene Objekt, Zugriffe von Threads auf andere Variablen der Instanz werden nicht blockiert.


naz
18.01.2015, 17:12

naja sowas ähnliches habe ich mir schon gedacht, allerdings ist mir das hier noch nicht so ganz klar..

public class Locker implements Runnable {

private final String name;
private final Integer monitor1;
private final Integer monitor2;
private final Integer monitor3;
static long startTime = System;currentTimeMillis();

public Locker(String name, Integer monitor1, Integer monitor2 , Integer monitor3) {
this;name = name;
this;monitor1 = monitor1;
this;monitor2 = monitor2;
this;monitor3 = monitor3;
}

;Override
//die ausgabe ist nicht vorhersehbar.
public void run() {
try {
synchronized (monitor1) {
System;out;println(name + " got " + monitor1 + " " + ((System;currentTimeMillis() - startTime) / 1000));
Thread;sleep(1000);
}
synchronized (monitor2) {
System;out;println(name + " got " + monitor2 + " " + ((System;currentTimeMillis() - startTime) / 1000));
Thread;sleep(1000);
synchronized (monitor3) {
System;out;println(name + " got " + monitor3 + " " + ((System;currentTimeMillis() - startTime) / 1000));
Thread;sleep(1000);
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}


wird so ausgeführt.
public static void main(String[] args) {
Thread thread1 = new Thread(new Locker("A", 3, 2, 1));
Thread thread2 = new Thread(new Locker("B", 2, 1, 1));
thread1;start();
thread2;start();
}


Das ist ne ehemalige Prüfungsaufgabe, an der ich gescheitert bin damals ^^..
ich sollte eine mögliche Ausgabe angeben.

jetzt nachdem ich die Aufgabe wieder sehe, habe ich sie mal in Eclipse eingegeben und geschaut was ausgegeben wird..
für mich macht das gar keinen sin.

hier mal paar Ausgaben
A got 3 0
B got 2 0
B got 1 1
A got 2 1
B got 1 2
A got 1 3


B got 2 0
A got 3 0
A got 2 1
B got 1 1
B got 1 2
A got 1 3


was mir besonders merkwürdig vorkommt ist, dass die ersten 2 Zeilen immer in der "Null"ten Sekunde ausgegeben werden.
Obwohl in dem ersten synchronized block Thread;sleep(1000); steht, wird es ignorieret?


Xen0n
24.01.2015, 07:12

was mir besonders merkwürdig vorkommt ist, dass die ersten 2 Zeilen immer in der "Null"ten Sekunde ausgegeben werden.
Obwohl in dem ersten synchronized block Thread;sleep(1000); steht, wird es ignorieret?


Das Thread#sleep() steht nach dem System;out;println-Call. Deswegen wird erst etwas ausgegeben und danach 1 Sekunde gewartet.


Und das ganze passiert halt 2 mal weil du 2 Threads startest.


Ähnliche Themen zu [Java] Synchronized welches Object übergeben?
  • [Java] TCP-Socket & Object-Input/Output-Stream -> Unkown Source
    Hi, Wie der Titel schon sagt, habe ich grad ein sehr sehr sehr.. sehr.. sehr.. nervtötendes Problem mit den ObjectStreams in Java. Folgender Ablauf meines Programms: 1. Client verbindet zu Server (klappt) 2. Client bietet Menüwahl und übergibt Menuitem (als String) an Server (klappt) 3. Server [...]

  • [Java] Nicht-Serializable Object speichern
    Hi, hat einer ne Ahnung wie ich ein Objekt in einer Datei speichern kann, welches nicht Serializable implementiert? Um direkt das Problem anzusprechen. Ich habe mehrere Areas (java;awt;geom;Area). Die möchte ich nun gerne speichern, natürlich mit zusätzlichen Daten meine Klasse class My [...]

  • [Java] NUll Object trotz Initialisierung
    // neue Frage unten !! Hallo also ich hab folgendes Problem zur Zeit: Ich habe mittels WindowBuilder in Eclipse eine Applikation erstellt, die ein wenig an meiner Dreambox rumspielt. Dazu soll am Anfang falls unbekannt die IP der Dreambox abgefragt werden. Ich habe dazu auch m [...]

  • [PHP] Pendant von JAVA Collection<Object> zu PHP
    Bin gerade in das Template System Smarty vertieft. Wollte mal fragen ob jemand weiß wie ich in PHP (typisiert) Objekte in einer Liste abspeichern kann und anschließend diese wiederum sauber ausgeben kann (mittels Smarty). Also so einer Art "Best Practise" Hintergrund, ich möchte einfach X Daten [...]



raid-rush.ws | Imprint & Contact pr