2016-05-05 3 views
3

Ich möchte ein Objekt, das von einem beliebigen Thread erstellt werden kann, aber sobald ein Thread ruft myObject.use() kann es nur von diesem Thread verwendet werden, bis myObject.release() aufgerufen wird.Gibt es eine Möglichkeit, ein Objekt nur für den ersten Thread nutzbar zu machen, der auf eine bestimmte Methode zugreift?

Ich möchte nicht die Entwickler zwingen, alle Methodenaufrufe für dieses Objekt/Klasse in synchronisierten Blöcken (die ich weiß, könnte verwendet werden, um diese Funktionalität approximieren), da dies wahrscheinlich zu Missbrauch des Objekts führen wird wenn sie vergessen, alle Anrufe von myObject.use() zu myObject.release() im selben synchronisierten Block zu wickeln.

Ist das möglich?

Könnte es mit einem ReentrantLock getan werden?

+0

Definiere _von diesem Thread verwendet_. –

+2

Klingt wie ein * Objekt Pool * für mich. –

+0

@SotiriosDelimanolis Eine Instanz in einem Thread ruft die Methoden der myObject-Instanz auf –

Antwort

1

Sicher kann es getan werden. Die use()-Methode sollte synchronisiert werden, so dass sie jeweils nur von einem Thread aufgerufen werden kann, und den aufrufenden Thread als Sperrthread in einer privaten flüchtigen Variablen speichern. Alle Anrufe - einschließlich use() - sollten zuerst prüfen, ob ein gesperrter gesperrter Thread vorhanden ist, und sofort zurückkehren - oder eine Ausnahme auslösen, wenn Sie dies bevorzugen - wenn es einen solchen Thread gibt und dieser nicht mit dem aufrufenden Thread übereinstimmt. release() sollte ebenfalls synchronisiert werden und kann den gespeicherten gesperrten Thread entfernen, wodurch der nächste Anruf an use() einen neuen gesperrten Thread speichern kann.

+0

Gibt es einen Weg, dies zu einer Klasse einer Bibliothek zu machen, die wir nicht pflegen? oder nur eine Gabel? machte mich darüber, wie jRat funktioniert –

+0

@AquariusPower Sie könnten die Bibliotheksklasse in eine eigene Klasse wickeln. –

Verwandte Themen