用Java锁定对象

时间:2016-08-12 19:40:20

标签: java time

如何将Java对象锁定一段时间(例如20秒)?通过锁定,我的意思是在那段时间内无法访问该对象。

3 个答案:

答案 0 :(得分:2)

您可以同步所有方法,并使用lock方法等待20秒并返回。

 public  synchronized void lock(){
            try {
                Thread.sleep(20 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }

请记住同步所有方法,并将所有字段保密。 (界面上的所有内容都应为synchronized

如果您需要为一般对象执行此操作 - 即您无法自行编写或指定的对象 - 那么现在是时候了解Monads如何工作:

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 :(得分:2)

没有通用机制来锁定Java中的对象。

您可以定义自己的可锁定对象类(例如,如DavidPérezCabrera和Edward Peters所建议的那样),但是无法锁定非设计的任意对象可锁定

答案 2 :(得分: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() {
         ...
    }

}