如何将Java对象锁定一段时间(例如20秒)?通过锁定,我的意思是在那段时间内无法访问该对象。
答案 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() {
...
}
}