Problem: Threads Synchronized machen

Rey

Mitglied
Hi,
ich wollte mal das Thema Threads aufgreifen um dessen Sinn zu verstehen welcher nicht schlecht ist.
Hat seinen nutzen aber ich sehe ehrlich gesagt keinen Unterschied daher frage ich mich Ob ich es richtig umsetze.

Ich gehe gerade ein Tutorial durch und habe den Begriff synchronized gesehen. Diesen fand ich gut und wollte ihn auch sofort einbauen in das Testprogramm. Aber wie oben erwähnt sehe ich keinen Unterschied.
Hier das Script
Java:
public class HelloThreads {
  public static void main (String[] args) {
    HelloLoop engl = new HelloLoop();
    HelloLoop germ = new HelloLoop();
    germ.setMessageText("Hallo, liebe Leute!");
    HelloLoop cat = new HelloLoop();
    cat.setMessageText("Miau!");

    Thread te = new Thread (engl);
    Thread tg = new Thread (germ);
    Thread tc = new Thread (cat);
    te.start();
    tg.start();
    tc.start();
  }
}

Die Klasse HelloLoop
Java:
public class HelloLoop implements Runnable {

  private String messageText = "Hello World!";

  public synchronized void setMessageText(String newText) {
    messageText = newText;
  }

  public String getMessageText() {
    return messageText;
  }

  public   void printText() {
    System.out.println (messageText);
  }

  public void run() {
    for (int i=1; i<=5; i=i+1) {
      printText();
      try { Thread.sleep(50); }
      catch (InterruptedException e) {}
    }
  }

}

Ich habe
synchronized gesetzt da ja 3 Prozesse gleichzeitig laufen und auf die Methode
zugreifen. Das ist doch richtig oder habe ich es doch an die Falsche Stelle gesetzt wenn ja bitte ich um Aufklärung.
Wie dem auch sei, wenn ich das synchronized weg mache sehe ich keinen Unterschied bei der Ausgabe.
Der Code wäre doch so Threadsave oder etwa nicht?
 
Zuletzt bearbeitet:
So wie ich das jetzt sehe stimmt dein synchronized. Dein Programm arbeitet VIEL zu wenig, damit eine Kollision zustande kommen könnte. Bei diesen paar System.out.println() freut sich deine JRE über Urlaub 😉
 
jeder Thread hat sein eigenes HelloLoop-Objekt, da kommt synchronized nicht zur Geltung,
erst wenn alle Threads auf dasselbe Objekt zugreifen

zudem wird setMessageText gar nicht im Thread aufgerufen sondern nur vorher vom main-Thread

und drittens ist setMessageText extrem kurz/ schnell, dass in den wenigen ms ein Konflikt stattfindet, ist unwahrscheinlich



hier mal ein Testprogramm mit wahrscheinlichen Konflikt, wenn synchronized fehlt
Java:
public class Test
{
    public static void main(String[] args)
    {
        HelloLoop h = new HelloLoop();

        Thread te = new Thread(h);
        Thread tg = new Thread(h);
        Thread tc = new Thread(h);
        te.start();
        tg.start();
        tc.start();
    }
}


class HelloLoop
    implements Runnable
{

    private String messageText = "Hello World!";

    public synchronized  void setMessageText(String newText)
    {
        messageText = newText;
        int sleep = (int)(Math.random() * 500);
        System.out.println("Thread " + newText + ", schläft jetzt " + sleep);
        try { Thread.sleep(sleep); } catch (InterruptedException e)  { }

        if (!messageText.equals(newText))
        {
            System.out.println("Thread " + newText + " beschwert sich, da war wohl jemand anders zwischendurch da: " + messageText);
        }
    }

    public String getMessageText()
    {
        return messageText;
    }

    public void printText()
    {
        System.out.println(messageText);
    }

    public void run()
    {
        int x = (int)(Math.random() * 100);
        System.out.println("Thread " + x + " startet");
        for (int i = 1; i <= 3; i++)
        {
            setMessageText(x + " ist der King");
        }
    }
}
 

Neue Themen


Zurück
Oben