2010-08-19 2 views
0

La seule exception est bien sûr si l'une des méthodes appelées en paramètre LocalObject stocke l'instance LocalObject d'une manière qui permet d'y accéder à partir d'autres threads. S'il te plait, calme-moi sur ça. comment c'est son travail.L'objet local est utilisé comme paramètre de méthode, puis les objets ne sont pas thread-safe. Pourquoi?

public void someMethod(){ 

    LocalObject localObject = new LocalObject(); 

    localObject.callMethod(); 

// localObject is not threadsafe 
    method2(localObject); 
} 

public void method2(LocalObject localObject){ 
    localObject.setValue("value"); 
} 
+0

Veuillez donner plus de contexte - on ne sait pas de quoi vous parlez. –

+0

pourquoi avez-vous le commentaire "localObject n'est pas threadsafe"? Je ne suis pas d'accord avec ce commentaire. – djna

Répondre

0

Je ne vois pas de problème évident de sécurité MT avec ceci. 'localObject' ne semble pas fuir quelque part permettant aux autres threads de le voir.

+0

Problème comme si une méthode appelée avec paramètre comme objet local puis objet local est thread-safe ou non. – Nishi

+0

L'appel d'une méthode n'introduit pas en soi de problèmes de thread, l'appel est sur la pile. Cependant, la méthode elle-même pourrait être écrite pour introduire des problèmes de threading, par exemple en plaçant une référence à l'objet local quelque part globalement. – djna

+0

Ce serait le cas si someMethod() avait un paramètre qui est mutable; mais dans ce cas, ce n'est pas le cas. Si 2 threads appelé votre someMethod() chaque thread obtient sa propre copie de 'localObject' – seand

0

Un scénario est pas thread-safe (Tn = filetage n):

T1 appelle someMethod premier; T2 appelle someMethod après cela.

Lors de l'exécution de method2 sur T1, la référence à localObject est modifiée par T2 entraînant un comportement indéfini.

+0

Les deux appels deux someMethod() auraient des références différentes à différents localObjects, les références étant sur la pile d'appels. Ils ne peuvent pas interférer les uns avec les autres dans le code indiqué. – djna

+0

Ups, je pensais que localObject a été déclaré en tant que membre de la classe. –

3

Vous semblez faire référence à this article, qui contient presque exactement l'extrait de code que vous présentez. Toutefois, cet article prétend que le code que vous affichez est thread safe.

Donc, il semble que vous avez des raisons d'affirmer que ce code est pas thread sûr, mais ne nous ont pas dit la raison de cette assertion.

Pour le code, vous affichez la seule vulnérabilité de threading si LocalObject lui-même a des problèmes de threads lui-même, par exemple s'il a des éléments de données statiques qui ne sont pas protégés correctement.

Je pense que peut-être vous demandez ce genre d'exemple

public class UnsafeClass{ 
    static LocalObject bestWeHaveSeen = new LocalObject(); 

    public void someMethod(){ 

     LocalObject localObject = new LocalObject(); 

     localObject.callMethod(); 

     // localObject is not threadsafe 
     method2(localObject); 
    } 

public void method2(LocalObject localObject){ 
    if (localObject.getValue("value") > bestWeHaveSeen.getValue("value")){ 
     bestWeHaveSeen = localObject; 
    } 

    // some code here to compute an important value 
    bestWeHaveSeen.setValue(computedValue); 
} 

Ceci est maintenant pas thread-safe. Comme deux threads différents peuvent accéder bestWeHaveSeen

1

Voici un exemple comment faire pas threadsafe:

private List<LocalObject> list = new ArrayList<LocalObject>(); 
public List<LocalObject> getList(){return list}; 

public void someMethod(){ 

    LocalObject localObject = new LocalObject(); 

    localObject.callMethod(); 

// localObject is not threadsafe 
    method2(localObject); 
} 

public void method2(LocalObject localObject){ 
    list.add(localObject); 
    localObject.setValue("value"); 
} 

method2 a été modifié pour stocker le localObject d'une manière qui permet à d'autres threads d'accéder - vers une liste publique accessible. Un autre thread pourrait maintenant obtenir l'objet de la liste et définir la valeur en même temps. Donc, même si nous travaillons avec un objet local, il n'est plus thread-safe et nous devons penser à la synchronisation.

Questions connexes