2017-10-20 44 views
-1

J'ai une méthode qui peut être accédée par un thread à la fois. Même si les threads utilisent des objets différents, un seul thread doit accéder à la méthode à la fois.Comment faire en sorte que plusieurs threads utilisant plusieurs objets puissent accéder à une partie de code mutuellement exclusive

Que puis-je utiliser en Java pour y parvenir? Je pense que le mot-clé 'synchronized' permettra à plusieurs threads à la fois d'accéder à la méthode s'ils utilisent des objets différents. La même chose avec les serrures Re-entrant je crois.

+0

Vous verrouillez un objet partagé, par ex. utilisez un 'ReentrantLock' stocké dans un champ' static', ou utilisez 'synchronized' sur un' Object' stocké dans un champ 'static'. – Andreas

Répondre

1

Voici quelques variantes. Si je comprends bien la question, je pense que vous cherchez # 5.

// 1. Static method 
public static synchronized void doSomething() { 
    // Mutually exclusive for all calls 
} 

// 2. Static w/ Shared lock 
private static Object STATIC_LOCK = new Object(); 

public static void staticMethod1() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

public static void staticMethod2() { 
    synchronized (STATIC_LOCK) { 
     // Mutually exclusive across staticMethod1() and staticMethod2() 
    } 
} 

// 3. Instance method 
public synchronized void doSomethingElse() { 
    // Mutually exclusive per instance of class 
} 

// 4. Instance w/ Shared lock 
private Object lock = new Object(); 

public static void method1() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

public static void method2() { 
    synchronized (lock) { 
     // Mutually exclusive across method1() and method2() for each class instance 
    } 
} 

// 5. Instance method synchronization across multiple class instances 
private static Object SHARED_LOCK = new Object(); 

public void commonInstanceMethod() { 
    synchronized (SHARED_LOCK) { 
     // Mutually exclusive across all class instances 
    } 
} 
+0

J'utilise le premier maintenant, car un seul thread peut y accéder, quel que soit le nombre d'objets dont il dispose. – hars

+0

@hars: # 1 et # 5 sont essentiellement la même chose. –

+0

En # 1, j'ai vu l'utilisation de la «méthode statique synchronisée» signifiait que je devais utiliser des contenus statiques à l'intérieur de la méthode, ce qui est un problème. J'ai donc commencé à utiliser # 5, ce qui est une très bonne façon de faire les choses. Aucun autre changement n'est requis lors de l'utilisation de ceci. – hars