【发布时间】:2014-04-22 10:40:40
【问题描述】:
public void method(Type1 inst1, Type2 inst2) {
synchronized(inst1) {
synchronized(inst2) {
//do something now
}
}
}
从这段代码可以理解,线程一旦进入方法,先获取inst1的锁,然后再获取inst2的锁,不释放inst1的锁。我假设这两个对象都没有被其他线程锁定。
- 如果一个线程一次只能获得一个对象的锁并且只能 当当前对象上的锁被释放时拥有另一个锁,如何 这段代码是否有效,或者更确切地说,它是我认为我在某处看到的有效代码吗?
- 如果 Type1 和 Type2 相同呢?
- 如果我们使方法同步会发生什么,考虑到它驻留在 方法的参数类型以外的类?
【问题讨论】:
-
理论上,一个线程可以持有的锁数量没有限制。使用
synchronized获得的锁是隐式可重入的,所以inst1和inst2引用同一个对象没有问题。我认为这是某种家庭作业(如果是的话,你应该这样标记它)。它试图让你思考的是死锁——如果线程 1 调用此方法并传递objA和objB,然后线程 2 调用它同时传递objB和objA -
这是一个常用于解释死锁的代码。同意。但是据我所知,我读过一些文本,一个线程一次只能锁定一个对象,并且不能在不释放的情况下获取不同对象的锁。这是我的疑问!
-
如果每个线程一次只允许持有一个锁,就不会有死锁这样的事情。你要么误解了你阅读的内容,要么你阅读的内容是错误的。仅仅因为有人在博客、论文甚至一本书中写了它,并不能使断言成立。
-
如果一个线程可以一个一个地锁定许多不同的对象而不释放任何对象,那么我认为它肯定可以多次锁定同一个对象。那么为什么会有一个可重入锁定的概念,它被解释为一些大的子主题?我这里只说一个线程,我理解在多个线程的情况下,如果一个线程试图获取一个已经被另一个线程占用的对象的锁,可能会出现死锁情况。
标签: java multithreading synchronization thread-synchronization