2016-05-05 3 views
3

Я хочу объект, который может быть создан любым потоком, но в тот момент, когда поток вызывает myObject.use(), он может использоваться только этим потоком до тех пор, пока не вызывается myObject.release().Есть ли способ сделать объект пригодным только для первого потока, который обращается к определенному методу?

Я не хочу, чтобы разработчикам приходилось обертывать все вызовы методов для этого объекта/класса в синхронизированных блоках (которые, как я знаю, могут использоваться для приближения этой функции), поскольку это может привести к неправильному использованию объекта если они забудут обернуть все вызовы от myObject.use() до myObject.release() в том же синхронизированном блоке.

Возможно ли это?

Это можно сделать с помощью ReentrantLock?

+0

Определить _used той нитью_. –

+2

Звучит как * пул объектов * для меня. –

+0

@SotiriosDelimanolis Какой-то экземпляр в потоке вызывает методы экземпляра myObject –

ответ

1

Уверен, это можно сделать. Метод use() должен быть синхронизирован, поэтому его можно вызывать только по одному потоку за раз и сохранять вызывающий поток в качестве блокирующего потока в частной изменчивой переменной. Все вызовы - в том числе use() - должны сначала проверить, есть ли сохраненный поток блокировки и сразу же вернуться - или выбросить исключение, если хотите - если есть такой поток и он не соответствует вызывающему потоку. release() также должен быть синхронизирован и может удалить сохраненную запирающую нить, что позволяет следующий вызов use() для хранения нового фиксирующего потока.

+0

есть ли способ сделать это в классе библиотеки, которую мы не поддерживаем? или только вилка? сделал мне о том, как работает jRat –

+0

@AquariusPower. Вы можете обернуть класс библиотеки в свой собственный класс. –