[Java] Synchronized welches Object übergeben?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von naz, 17. Januar 2015 .

  1. 17. Januar 2015
    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:
    Code:
     ... 
     synchronized(myObject) { 
     ... // innerhalb dieses Blocks besteht die Sperre 
     } 
     ...
    Warum muss ich denn hier ein Object angeben?

    Danke schonmal
     
  2. 17. Januar 2015
    AW: [Java] Synchronized welches Object übergeben?

    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:
    Code:
    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.
     
  3. 18. Januar 2015
    AW: [Java] Synchronized welches Object übergeben?

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

    Code:
    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.
    Code:
    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
    Code:
    A got 3 0
    B got 2 0
    B got 1 1
    A got 2 1
    B got 1 2
    A got 1 3
    Code:
    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?
     
  4. 24. Januar 2015
    AW: [Java] Synchronized welches Object übergeben?

    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.
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.