2016-05-05 2 views
3

Je veux un objet qui peut être créé par n'importe quel thread, mais le moment où un thread appelle myObject.use() il peut seulement être utilisé par ce fil jusqu'à ce que myObject.release() soit appelé. Je ne veux pas forcer les développeurs à devoir encapsuler tous les appels de méthodes pour cet objet/classe dans des blocs synchronisés (ce qui, je le sais, pourrait être utilisé pour approximer cette fonctionnalité) car cela risque d'entraîner une mauvaise utilisation de l'objet s'ils oublient d'encapsuler tous les appels de myObject.use() à myObject.release() dans le même bloc synchronisé.Existe-t-il un moyen de rendre un objet utilisable uniquement par le premier thread qui accède à une méthode spécifique?

Est-ce possible?

Pourrait-il être fait avec un ReentrantLock?

+0

Définissez _utilisé par ce thread_. –

+2

On dirait un * objet pool * pour moi. –

+0

@SotiriosDelimanolis Une instance dans un thread appelle les méthodes de l'instance de myObject –

Répondre

1

Bien sûr que cela peut être fait. La méthode use() doit être synchronisée, elle peut donc être appelée par un seul thread à la fois et stocker le thread appelant en tant que thread de verrouillage dans une variable volatile privée. Tous les appels - y compris use() - devraient d'abord vérifier s'il y a un thread de verrouillage stocké et retourner immédiatement - ou lancer une exception si vous préférez - s'il y a un tel thread et qu'il ne correspond pas au thread appelant. release() doit également être synchronisé et peut supprimer le fil de verrouillage stocké, permettant l'appel suivant à use() pour stocker un nouveau thread de verrouillage.

+0

Y at-il un moyen de faire cela à une classe d'une bibliothèque que nous ne maintenons pas? ou seulement une fourchette? m'a fait comprendre comment fonctionne jRat –

+0

@AquariusPower Vous pourriez envelopper la classe de la bibliothèque dans une classe qui vous est propre. –