2010-12-11 6 views
2

J'ai créé deux threads en utilisant une seule instance de classe appelée méthodes statiques et non statiques de cet objet. Idéalement, les méthodes statiques doivent être appelées en utilisant le nom de la classe et je l'ai fait aussi.Blocs synchronisés pour les méthodes statiques et non statiques

J'ai synchronisé les méthodes statiques et non statiques sur un membre statique privé de la classe dont les méthodes appellent les threads. J'ai remarqué que la sortie était synchronisée!

Mes questions sont les suivantes:

  1. méthodes statiques si synchronisées à l'aide d'un bloc synchronisé nécessite généralement l'instance de classe, alors comment est-il accepter un objet statique! Comment la sortie a-t-elle été synchronisée lorsque les méthodes statiques appelant des threads acquièrent le verrou de niveau classe et que les threads appelant des méthodes non statiques acquièrent le verrou au niveau de l'objet!
    Même si j'ai utilisé un bloc synchronisé dans les méthodes statiques et non statiques basées sur un objet, il ne devrait pas vraiment se synchroniser; ou est-ce un cas particulier avec des blocs synchronisés sur des objets statiques?

Faites-moi savoir.

Voici le code que je l'ai écrit:

public class StaticNonStaticSynch 
{ 
public static void main(String[] args) 
{ 
    final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); 

    Runnable runnable1 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.nonStaticMethod(); 
    } 
    }; 

    Runnable runnable2 = new Runnable() 
    { 
    @Override 
    public void run() 
    { 
    staticNonStaticTest.staticMethod(); 
    } 
    }; 

    Thread thread1 = new Thread(runnable1, "First Thread"); 
    Thread thread2 = new Thread(runnable2, "Second Thread"); 

    thread1.start(); 
    thread2.start(); 
} 
} 

class StaticNonStaticTest 
{ 
private static Object object = new Object(); 

void nonStaticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 

static void staticMethod() 
{ 
    synchronized (object) 
    { 
    for(int i=0;i<500;i++) 
    { 
    System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i); 
    } 
    } 
} 
} 
+0

Veuillez modifier le texte correctement. Utilisez l'icône 101010 pour l'extrait de code. –

+0

_ "les threads appelant des méthodes non statiques acquièrent un verrou au niveau de l'objet" _ ils n'acquièrent pas de verrou au niveau de l'objet. La méthode d'instance acquiert un verrou au niveau de la classe. – khachik

Répondre

4

À l'échelle mondiale, il existe une instance de la chose appelée StaticNonStaticTest.object. Chaque fois que vous synchronisez sur cette chose (, peu importe où de), vous synchronisez sur le même verrou.

-1

Vous synchronisez sur la base d'un objet statique, c'est la raison pour laquelle le verrou est obtenu au niveau de la classe et les méthodes statiques et non statiques sont synchronisées. Si vous commentez la ligne "synchronized (object)" dans la méthode statique et non statique, vous pouvez voir que les appels ne sont plus synchronisés.

Questions connexes