Java blocs synchronisés

Si nous avons une méthode:

public void doSomething(){
    synchronized(this){
        //some code processing here
    }
    String temp = "init"; //instead of i++
    synchronized(this){
        //some other code processing here
    }
}

Cette méthode est équivalente à public synchronized void doSomething()?

Est-il une raison pas de supposer que le planificateur de threads dans certaines exécutions, pas résultat dans le même flux que la synchronisation de l'ensemble de la fonction? Qui est:

  • Thread1 entre la première synchronisation de bloc.
  • Thread2 blocs.
  • Thread1 continue avec i++ et se déplace à la deuxième bloc synchronisé tout en Thread2 reste bloqué.
  • Comme un résultat, Thread2 entre la méthode après Thread1 a quitté les deux blocs synchronisés.

Tous j'ai besoin de savoir, c'est:

  • Puis-je compter sur tous les contextes d'exécution que les deux threads (Thread1 et Thread2) peut être dans la méthode en même temps? Par exemple, Thread2 dans la première synchronisation de bloc et Thread1 dans la seconde synchronisation de bloc pour atteindre la simultanéité.
  • Une exécution de flux, où un seul thread va être dans la méthode (à un moment) de la sérialisation de l'ensemble des flux, ce qui équivaut à public synchronized void doSomething()?
Pourriez voulez mettre à jour votre corps post pour refléter votre déménagement de i++.
Code mis à jour comme demandé

OriginalL'auteur Cratylus | 2010-08-04