使用同步(内在锁)关键字锁定被锁定在Java中,我们可以这样做:如何指定对象使用锁定
public void addSum(int a) {
synchronized(q) {
q.add(a); // q is say a Queue
}
}
在上面的代码中说,当一个对象试图调用addSum()方法iexaddSum(10),锁将在'q'上保持而不是x。因此,使用同步我们可以锁定除实际调用对象(Class)以外的对象。
下面我正在使用来自java并发包的锁,有没有一种方法来指定锁应该在哪个对象上(即像在上面的代码片断中使用synchronized一样,指定了锁定/同步应该在' q')。但是,下面当我使用锁定时,我没有指定应锁定哪个对象。可以做到吗?
public void addSum(int a) {
lock.tryLock();
q.add(a);
lock.unlock();
}
我没有参考 - http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html。然而,正在寻找更小的例子来清除我的概念。
哦,当我说q.add(a)它实际上不会自己调用。它是队列中的add方法。我将其他方法名称更改为addSum。所以我展示的代码片段实际上并不是以不同的方法开始和结束。 – srock 2014-09-25 05:22:08
所以当我在上面的代码片段中使用Lock时,它锁定了哪个对象?在同步代码段中,它锁定在'q'上。 – srock 2014-09-25 05:27:46
@srock第一条评论:将'synchronized'语法工作为code_的_block,嵌套在方法中或跨越整个方法。你在块的开头获得锁,并在最后释放它。然而,一个'Lock'对象的锁可以跨越多个_codes,进出方法调用,并且潜在地(危险地)永远不会被释放。 – 2014-09-25 05:33:26