2016-08-12 3 views
0

Как объект Java может быть заблокирован на определенное время (например, 20 секунд)? Заблокирован, я имею в виду, что к этому объекту нельзя получить доступ в это время.Заблокировать объект в Java

+0

Какой тип объекта –

+6

Из любопытства, почему вы хотите это сделать? – Javant

+0

У меня есть классная книга, и мне нужно заблокировать экземпляр этого класса – johnny94

ответ

2

Вы можете синхронизировать все методы и использовать метод 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%, но до тех пор, пока вы не позволите свободно обернуть ссылки, все должно быть в порядке.

+1

Можете ли вы привести пример?!? –

+0

@YagamiLight отредактировал один в –

+0

, чем вы, например, но вопрос еще в моей голове, я использую этот метод или таймер вместо него –

1

Чтобы быть более точным, весь его метод должен быть 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() { 
     ... 
    } 

} 
2

Там нет общих механизма блокировки объектов в Java.

Вы можете определить свой собственный класс запираемых объектов (например, как это было предложено Дэвид Переса Кабрера и Эдвард Peters), но нет никакого способа, чтобы блокировать любые объекты, которые не были разработаны быть запираются.

+0

Не считаете ли вы 'synchronized (foo)' как способ блокировки объекта, на который указывает 'foo'? –

+0

@LewBlock, это будет зависеть от того, что вы подразумеваете под «блокировкой». Если вы посмотрите на вопрос, в нем четко сказано: «Я заблокирован, я имею в виду, что к объекту нельзя получить доступ». Синхронизация на объекте не делает то, что запросил OP: он не мешает другим потокам получать доступ или изменять объект. –