我努力学习线程,以及关于下面的例子的Java锁对象
public class LockExample {
private Lock lockone = new ReentrantLock();
public void method1() {
lockone.lock();
try {
// do something
} finally {
lockone.unlock();
}
}
public void method2() {
lockone.lock();
try {
// do something
} finally {
lockone.unlock();
}
}
}
意思是,如果我们使用相同的锁锁
method1
和method2
,说线程A
和B
不能同时访问method1
或method2
。但如果我们锁定method1
和method2
使用不同的锁lockone
和locktwo
,那么线程A
可以访问method1
,同时线程B
可以访问method2
?为什么我们不分别锁定每个方法而不是将它们放在一个锁中?
public class LockExample {
private Lock lockone = new ReentrantLock();
public void method1() {
lockone.lock();
try {
// do something
} // wrap the two methods in one lock?
}
public void method2() {
try {
// do something
} finally {
lockone.unlock();
}
}
}
}
您发布的代码的第二部分没有意义。例如,如果一个线程在不保持锁的情况下调用'method2'(即没有先前调用'method1'),则抛出'IllegalMonitorStateException'。 – 2014-10-18 10:26:19
@CristianGreco - 我认为OP正试图解释他的逻辑,而不是实际的代码:) – TheLostMind 2014-10-18 10:27:18
也许这对你来说很明显,但以防万一它不是:你的LockExample类的每个实例都有自己单独的ReentrantLock对象。所以如果你有两个LockExample对象,a和b,它可以让一个线程在a.method1()中,而另一个线程在b.method2()中。再说一次,很抱歉,如果这是显而易见的,但这似乎是一个很多初学者不容易掌握的想法。 – 2014-10-18 15:25:34