Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中锁定对象_Java_Time - Fatal编程技术网

在Java中锁定对象

在Java中锁定对象,java,time,Java,Time,如何将Java对象锁定一定时间(例如20秒)?通过锁定,我的意思是在这段时间内无法访问对象。您可以同步所有方法,并拥有一个只需等待20秒并返回的锁定方法 public synchronized void lock(){ try { Thread.sleep(20 * 1000); } catch (InterruptedException e) { e.printStackTrac

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

您可以同步所有方法,并拥有一个只需等待20秒并返回的锁定方法

 public  synchronized void lock(){
            try {
                Thread.sleep(20 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }
记住同步所有方法,并保持所有字段私有。接口上的所有内容都应该同步

如果您需要对一般对象执行此操作(即,您无法编写或指定自己的对象),那么是时候学习单子如何工作了:

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%无敌,但只要您不让未包装的引用松脱,就应该没问题。

您可以同步所有方法,并拥有一个只需等待20秒并返回的锁定方法

 public  synchronized void lock(){
            try {
                Thread.sleep(20 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }
记住同步所有方法,并保持所有字段私有。接口上的所有内容都应该同步

如果您需要对一般对象执行此操作(即,您无法编写或指定自己的对象),那么是时候学习单子如何工作了:

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%无敌的,但只要你不让未包装的引用松脱,就应该没问题。

更准确地说,它的所有方法都必须同步,它的所有字段都必须是私有的


更准确地说,它的所有方法都必须是同步的,它的所有字段都必须是私有的

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

您可以定义自己的可锁定对象类,如David pérez Cabrera和Edward Peters所建议的,但无法锁定未设计为可锁定的任意对象。

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



您可以定义自己的可锁定对象类,例如,按照David pérez Cabrera和Edward Peters的建议,但无法锁定未设计为可锁定的任意对象。

出于好奇,什么类型的对象?为什么要这样做?我有一本类书,我需要锁定那个类的实例出于好奇什么类型的对象你为什么要这样做?我有类书,我需要锁定那个类的实例你能提供一个例子吗?!?但我脑子里仍然有一个问题,我是用这个方法还是用定时器来代替it@YagamiLight你可以用你喜欢的任何方式来测量时间,我不认为这有什么区别here@DavidP是的,它肯定有它的缺点。不过写起来很有趣。这段代码不正确地处理InterruptedException。请看Brian Goetz等人在实践中的Java并发性,以获得正确的处理。您能提供一个示例吗?!?但我脑子里仍然有一个问题,我是用这个方法还是用定时器来代替it@YagamiLight你可以用你喜欢的任何方式来测量时间,我不认为这有什么区别here@DavidP是的,它肯定有它的缺点。不过写起来很有趣。这段代码不正确地处理InterruptedException。在Brian Goetz的实践中,看看java并发,以进行适当的处理。你不认为同步Foo是锁定Foo?@ LeWBLUT指向的对象的一种方式,这取决于你所说的锁的含义。如果你看这个问题,它清楚地说,通过锁定,我的意思是对象不能被访问。对象上的同步不执行OP所要求的:它不会阻止其他线程访问或修改对象。是否将同步FO视为锁定由FO?@ LeWBLUT指向的对象的方法,这取决于锁的含义。如果你看这个问题,它清楚地说,通过锁定,我的意思是对象不能被访问。在对象上同步不会执行OP要求的操作:它不会阻止其他线程访问或修改对象。