Toegang tot niet-gesynchroniseerde klassenmethode wanneer de sync-methode is vergrendeld

Ik heb een gesynchroniseerde methode en een niet-gesynchroniseerde methode in een klasse en ik heb één thread die een vergrendeling op de gesynchroniseerde methode oplevert.

Mijn vraag is dit: kunnen andere threads toegang krijgen tot de niet-gesynchroniseerde methode van de klasse in deze situatie?

3
Alleen de code die het slot moet bevatten, wordt telkens één thread uitgevoerd. Code die zonder het slot kan worden uitgevoerd, kan worden uitgevoerd, ongeacht of het object is vergrendeld of niet.
toegevoegd de auteur Peter Lawrey, de bron

3 antwoord

Yes. The method remains accessible to other threads if it is not declared synchronized

4
toegevoegd
Wacht, wordt het object niet vergrendeld? Dus als het object is vergrendeld door thread 1 ... dan zou thread 2 geen toegang moeten hebben tot een methode/variabele van dat object, toch? Is dat niet hoe synchroniseren werkt
toegevoegd de auteur Akshay L Aradhya, de bron
Maar een of andere thread had dat object alvast op slot ..., dan hoe het mogelijk is voor andere threads om dat vergrendelde object in te voeren
toegevoegd de auteur Siva, de bron
maar u zei dat de methode toegankelijk blijft voor andere threads als deze niet gesynchroniseerd is verklaard?
toegevoegd de auteur Siva, de bron
Hoewel we die klasse vergrendelen, kunnen andere threads de normale methoden gebruiken ..?
toegevoegd de auteur Siva, de bron
Nee, het gebruikt het slot om toegang te krijgen tot de mathod. Als een andere thread probeert hetzelfde slot opnieuw te gebruiken, loopt het vast en wacht tot de andere is voltooid
toegevoegd de auteur GETah, de bron
Ja, als u geen methode gesynchroniseerd opgeeft, blokkeert de andere thread niet en heeft toegang tot die methode
toegevoegd de auteur GETah, de bron
Ja, dat is hoe de gesynchroniseerde vergrendeling werkt :)
toegevoegd de auteur GETah, de bron
Ja, het object wordt vergrendeld maar onthoud: een tweede thread kan altijd toegang krijgen tot dat object zolang het niet langs een gesynchroniseerd -blok loopt op het vergrendelde object
toegevoegd de auteur GETah, de bron

Ja, andere threads hebben toegang tot niet-gesynchroniseerde methoden, maar onthoud dat andere threads geen toegang hebben tot je andere gesynchroniseerde methoden, omdat er maar één lock per object is, niet per methode.

2
toegevoegd

Een gesynchroniseerde methode is slechts een syntactische snelkoppeling voor een gesynchroniseerd blok met behulp van de huidige instantie als een monitor (vergrendeling):

public synchronized void abc() {
    //something to do
}

is gelijk aan

public void abc() {
    synchronized(this) {
        //something to do
    }
}

Voor het uitvoeren van een gesynchroniseerd blok moet een thread eerst de bijbehorende monitor verkrijgen, in dit geval this , die garandeert dat er niet meer dan één thread tegelijkertijd het blok kan uitvoeren.

Het feit dat dit wordt gebruikt als een monitor, biedt geen garantie voor iets buiten het gesynchroniseerde blok. Met andere woorden, als uw object niet-gesynchroniseerde methoden bevat, kunnen ze gelijktijdig door meerdere threads worden uitgevoerd, omdat ze niet vereisen dat de lopende threads de deze -monitor verkrijgen.

1
toegevoegd