Threads Synchronized

JavaL

Mitglied
Hallo Java Profis,
ich bin etwas verwirrt, weil es mir immer in anderer Version erklärt wird, deshalb folgende Fragen:

Ich habe eine Klasse, welche Methoden enthält und Blöcke, die als synchronized deklariert sind. Ich erzeuge nun zwei Thread Objekte dieser Klasse, A und B. Nun greife ich mit A auf eine synchronized Methode bzw. synchronized Block zu.

1.) Kann Objekt B nun auf dieselbe Methode/Block zugreifen? - Nein schätze ich als Antwort?
2.) Kann Objekt B auf andere synchronized Methoden/Block zugreifen? - Mir wurde gesagt nein, da die synchronized Klassenmethoden und Blöcke für alle anderen Threads gesperrt sind, ist das richtig?
3.) Wie verhält es sich wenn die Klasse als synchronized deklariert ist?
4.) Wie verhält es sich wenn eine Methode als static synchronized deklariert ist?

5.) Ich verstehe immer noch nicht genau was genau der Unterschied ist, eine Klasse mit implements Runnable oder extends Thread zu deklarieren(?)

Wäre für Aufklärung wirklich dankbar. :)

JavaL
 
S

SlaterB

Gast
Klassen kann man nicht synchronized deklarieren,
der Rest ist bei dir reichlich unklar beschrieben, etwa ob B an sich selber oder an A Methoden aufruft

im Gegensatz dazu ist synchronized eigentlich einfach und klar:
der Thread der als erster drin ist, hat den Zugriff, andere müssen warten,
statische Methoden gibts nur 'einmal', betrifft jeden Thread der dort vorbei kommt,

nicht-statische Synchronisierung ist auf ein Objekt beschränkt,
bei anderen Objekte derselben Klasse muss nicht jucken, wenn beim ersten schon jemand Zugriff hat

zu 5.) : du hast zwei Dinge, die klar definiert sind, damit ergeben sich doch die Unterschiede von selber,
wenn du nicht weißt, was die beiden Dinge bedeuten, dann kannst du sie kaum vergleichen,
ansonsten fasse doch bitte beide Varianten ein wenig in Worte

alle Folgerungen muss man natürlich nicht sofort wissen, aber allzu fern liegen sie auch nicht:
einer Klasse die Runnable implementiert steht es frei, von etwas anderem zu erben, das kann ein Thread nicht
usw.
 

Marco13

Top Contributor
der Thread der als erster drin ist, hat den Zugriff, andere müssen warten,

Außer, wenn der erste Thread wartet. Da waren kürzlich ein paar Puzzler in [JavaSpecialists 199] - Hacking Java Surreptitiously . In diesem Beispiel kann man das mit dem CONFUSE-Flag umschalten:

Java:
class Highlander
{
    void birth()
    {
    }
    void death()
    {
    }
}

public class SyncTest
{
    private static boolean CONFUSE = true;
    
    public static void main(String[] args)
    {
        final SyncTest s = new SyncTest();
        final Highlander h0 = new Highlander()
        {
            @Override
            void death()
            {
                if (CONFUSE)
                {
                    synchronized (s)
                    {
                        try
                        {
                            s.wait(500);
                        }
                        catch (InterruptedException e)
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        final Highlander h1 = new Highlander()
        {
            @Override
            void birth()
            {
                if (CONFUSE)
                {
                    synchronized (s)
                    {
                        s.notifyAll();
                    }
                }
            }
        };
        Thread t0 = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                s.highlander(h0);
            }
        });
        t0.start();
        Thread t1 = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                s.highlander(h1);
            }
        });
        t1.start();
    }
    
    private int counter = 0;
    
    public synchronized void highlander(Highlander h)
    {
        counter++;
        h.birth();
        System.out.println("A highlander is born: "+h);

        if (counter > 1)
        {
            System.out.println("What the...?");
        }
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        h.death();
        counter--;
        System.out.println("A highlander died   : "+h);
    }
    
}
 
S

SlaterB

Gast
hmm, wer wartet, ist quasi NICHT mehr drin, dann dürfen natürlich noch andere ran,
oder steckt mehr in dem Beispiel und dem Link?
grad keine Zeit mehr zum Lesen, vielleicht auch nicht gut hier damit noch zu verwirren ;)
 

Marco13

Top Contributor
Ja, die mögliche Verwirrung hat mich auch zögern lassen, aber die wichtige Message ("Wer wartet, blockiert den synchronized-Block nicht mehr") hast du ja schon genannt. In dem Link gibt's nicht viel, was darüber hinausgeht, eben Fragen die darauf rauslaufen, dass man durch fiese Tricks in einen vermeintlich "sicheren" (weil synchronizeden) Block doch mit mehreren Threads reinkommt.
 

JavaL

Mitglied
Hallo, danke schonmal für die Antworten. Nehmt es mir nich übel aber mir ist das immer noch nicht ganz klar.

Klassen kann man nicht synchronized deklarieren
Okay, dann habe ich wohl den ersten Teilsatz dieser Aussage
Sperre gilt für die Klasse bzw. die static synchronized Methoden der Klasse
unseres Profs nicht richtig verstanden/interpretiert.

der Thread der als erster drin ist, hat den Zugriff, andere müssen warten,
statische Methoden gibts nur 'einmal', betrifft jeden Thread der dort vorbei kommt,
Erste Zeile verstanden, danke. Zweite Zeile: Heißt das die Methode darf genau einmal aufgerufen werden?

nicht-statische Synchronisierung ist auf ein Objekt beschränkt,
bei anderen Objekte derselben Klasse muss nicht jucken, wenn beim ersten schon jemand Zugriff hat
Alles klar. Das heißt aber dass egal wie viele synchronized Methoden ich habe, sobald ein Thread eines Objektes A sich in einer der vielen synchronized Methoden befindet, dürfen alle anderen Threads des Objektes A sich in keiner von diesen synchronized Methoden aufhalten?

der Rest ist bei dir reichlich unklar beschrieben, etwa ob B an sich selber oder an A Methoden aufruft
Wie sieht denn ein Methodenaufruf von A über B aus? Kannst du da mal ein Beispiel machen oder mich entsprechend auf Literatur verweisen, wäre super.

Danke nochmal für die bisherigen Antworten.
 
S

SlaterB

Gast
Zweite Zeile: Heißt das die Methode darf genau einmal aufgerufen werden?
unabhängig von synchronized weißt du das doch hoffentlich,
synchronized ist nur für Ausschluss interessant
Alles klar. Das heißt aber dass egal wie viele synchronized Methoden ich habe, sobald ein Thread eines Objektes A sich in einer der vielen synchronized Methoden befindet, dürfen alle anderen Threads des Objektes A sich in keiner von diesen synchronized Methoden aufhalten?
ja

Wie sieht denn ein Methodenaufruf von A über B aus? Kannst du da mal ein Beispiel machen oder mich entsprechend auf Literatur verweisen, wäre super.

jeder Aufruf der Welt ist ganz normal, baue du doch bitte die Beispiele
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
A Thread - Synchronized Java Basics - Anfänger-Themen 10
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
O synchronized Java Basics - Anfänger-Themen 39
O synchronized difference Java Basics - Anfänger-Themen 5
E Synchronisierte Methoden vs. Synchronized(lockObject) Block Java Basics - Anfänger-Themen 7
T Was bringt das synchronized bei der Methode? Java Basics - Anfänger-Themen 12
temi Synchronized(Monitor) Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
Shams Synchronized-Schlüsselwort bei Inkrementierung einer statischen Variable Java Basics - Anfänger-Themen 13
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Threads synchronized und wait Java Basics - Anfänger-Themen 2
N Threads Probleme mit synchronized Java Basics - Anfänger-Themen 9
B synchronized threads Java Basics - Anfänger-Themen 17
U synchronized / lock Java Basics - Anfänger-Themen 8
P Arraylist synchronized? Java Basics - Anfänger-Themen 6
X3TitanCore Methoden synchronized bei einer Methode Java Basics - Anfänger-Themen 2
P synchronized methoden Java Basics - Anfänger-Themen 3
B warum schließt synchronized andere threads nicht aus? Java Basics - Anfänger-Themen 7
M Synchronized klappt nicht Java Basics - Anfänger-Themen 11
E synchronized Methoden Java Basics - Anfänger-Themen 3
M synchronized( ref ) Java Basics - Anfänger-Themen 3
I Synchronized Threads Java Basics - Anfänger-Themen 4
R Problem: Threads Synchronized machen Java Basics - Anfänger-Themen 5
M OOP Synchronized Methoden, zugriff aus Threads Java Basics - Anfänger-Themen 4
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S Fragen zu synchronized + Singleton! Java Basics - Anfänger-Themen 10
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
J simple Frage zu synchronized Java Basics - Anfänger-Themen 4
S Threads: synchronized mach nicht was es soll? Java Basics - Anfänger-Themen 6
L Threads und synchronized Java Basics - Anfänger-Themen 8
R wait() in synchronized - Block oder nicht? Java Basics - Anfänger-Themen 4
X Synchronized Zugriff ArrayList<E> Java Basics - Anfänger-Themen 6
G synchronized Java Basics - Anfänger-Themen 5
M synchronized variables? Java Basics - Anfänger-Themen 8
B Verständnissfrage synchronized Java Basics - Anfänger-Themen 2
S Warum wirkt hier synchronized nicht? Java Basics - Anfänger-Themen 9
C Trotz "synchronized" unerwartete Ausgabe Java Basics - Anfänger-Themen 2
E Synchronized - Methoden in verschied. Klassen Java Basics - Anfänger-Themen 3
C synchronized Java Basics - Anfänger-Themen 2
J Fragen zu Synchronized Java Basics - Anfänger-Themen 6
T synchronized HashMap Java Basics - Anfänger-Themen 7
L Problem mit synchronized und String Java Basics - Anfänger-Themen 2
A Problem mit Threads und synchronized Java Basics - Anfänger-Themen 3
B Was bedeutet synchronized? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben