Как объект Java может быть заблокирован на определенное время (например, 20 секунд)? Заблокирован, я имею в виду, что к этому объекту нельзя получить доступ в это время.Заблокировать объект в Java
ответ
Вы можете синхронизировать все методы и использовать метод lock
, который просто ждет 20 секунд и возвращается.
public synchronized void lock(){
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
Помните о синхронизации всех методов и сохраняйте все поля частными. (Все на интерфейс должен быть synchronized
)
Если вам нужно сделать, это для общего объекта - то есть, один вы не можете писать или указать себя - то это время, чтобы узнать, как монады работы:
public class Lockable<T> {
private T _t;
public Lockable(T t){
_t = t;
}
public synchronized void perform(Consumer<T> consumer){
consumer.accept(_t);
}
public synchronized <R> R get(Function<T, R> function){
return function.apply(_t);
}
public synchronized<R> Lockable<R> map(Function<T, R> function){
return new Lockable(function.apply(_t));
}
public synchronized void lock(){
try {
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread.interrupt();
}
}
}
Вышеуказанное не является непревзойденным на 100%, но до тех пор, пока вы не позволите свободно обернуть ссылки, все должно быть в порядке.
Можете ли вы привести пример?!? –
@YagamiLight отредактировал один в –
, чем вы, например, но вопрос еще в моей голове, я использую этот метод или таймер вместо него –
Чтобы быть более точным, весь его метод должен быть synchronized
, и все его поле должно быть private
.
public class LockeableObject {
private String fieldFoo;
public synchronized void lock() throws InterruptedException{
this.wait(20 * 1000); // 20 seconds
}
public synchronized void foo() {
...
}
public synchronized void foo2() {
...
}
}
Там нет общих механизма блокировки объектов в Java.
Вы можете определить свой собственный класс запираемых объектов (например, как это было предложено Дэвид Переса Кабрера и Эдвард Peters), но нет никакого способа, чтобы блокировать любые объекты, которые не были разработаны быть запираются.
Не считаете ли вы 'synchronized (foo)' как способ блокировки объекта, на который указывает 'foo'? –
@LewBlock, это будет зависеть от того, что вы подразумеваете под «блокировкой». Если вы посмотрите на вопрос, в нем четко сказано: «Я заблокирован, я имею в виду, что к объекту нельзя получить доступ». Синхронизация на объекте не делает то, что запросил OP: он не мешает другим потокам получать доступ или изменять объект. –
Какой тип объекта –
Из любопытства, почему вы хотите это сделать? – Javant
У меня есть классная книга, и мне нужно заблокировать экземпляр этого класса – johnny94