Java 什么是类级、对象级、显式和内在锁定?
我一直在学习Java多线程的概念。我看得越多,就越糊涂 现在我还不了解Java中类级、对象级、显式和内在锁定之间的区别。有人能告诉我哪个是什么吗?另外,如果我能理解一些例子,那将对我非常有帮助。显式与内在 当您在对象上使用Java 什么是类级、对象级、显式和内在锁定?,java,multithreading,locking,Java,Multithreading,Locking,我一直在学习Java多线程的概念。我看得越多,就越糊涂 现在我还不了解Java中类级、对象级、显式和内在锁定之间的区别。有人能告诉我哪个是什么吗?另外,如果我能理解一些例子,那将对我非常有帮助。显式与内在 当您在对象上使用synchronized或间接作为方法签名的一部分时,您正在创建一个。您依赖于与所有对象和类关联的内置锁 Java5+在包Java.util.concurrent.locks中提供了一个显式锁。最常用的类可能是ReentrantLock。它们提供了使用内在锁的替代方案,并提供了
synchronized
或间接作为方法签名的一部分时,您正在创建一个。您依赖于与所有对象和类关联的内置锁
Java5+在包Java.util.concurrent.locks
中提供了一个显式锁。最常用的类可能是ReentrantLock
。它们提供了使用内在锁的替代方案,并提供了内在锁无法实现的功能
类级别与对象级别
这种区别仅适用于内部锁。如果有,则使用的内部锁将与类对象本身相关联。如果在对象实例上同步(或具有同步实例方法),则它将是对象级锁
进一步阅读 Brian Goetz的书是一本很好的书,它帮助我们理解了Java中多线程编程的噩梦般的混乱世界。“类级”锁定和“对象级”锁定都是人为的想法,作者可能对Java的内在锁定的工作原理没有深入的了解 类级锁定如下所示:
class Foobar {
static synchronized void moo() { ... }
}
class Foobar {
synchronized void baa() { ... }
}
但这种结构实际上只是一种简写方式:
class Foobar {
static void moo() {
synchronized (Foobar.class) { ... }
}
}
和对象级锁定,如下所示:
class Foobar {
static synchronized void moo() { ... }
}
class Foobar {
synchronized void baa() { ... }
}
只不过是以下方面的简写:
class Foobar {
static void baa() {
synchronized (this) { ... }
}
}
因此,实际上,在“类级”和“对象级”锁定下面,只有一个概念,synchronized
块:
synchronized(objectReference) {...}
您需要知道的是,JVM将不允许多个线程同时在同一对象上同步
如果要保护的数据是全局数据,那么在访问数据时在全局单例对象上同步是有意义的Foobar.class
是一个全局单例
当要保护的数据完全包含在某个对象实例中时,在与该实例关联的某个对象上或在实例本身(即,此
)上进行同步是有意义的。当使用“Synchronized”关键字时,它使用内部锁或监视器。Java中的每个对象都有一个与之关联的内在锁。每当线程试图访问同步块或方法时,它就会获取该对象或对象级锁上的内部锁或监视器。对于静态方法,线程获取类对象上的锁
public synchronized void doAtomicTransfer(){
//enter synchronized block , acquire lock over this object.
operation1()
operation2();
} // exiting synchronized block, release lock over this object.
固有锁定机制可能有一些功能限制,例如:
- 不可能中断等待获取锁的线程(可中断地锁定)
- 如果不愿意永远等待锁,就不可能尝试获取锁(try lock)。一次只能有一个线程持有锁:例如,没有允许多个线程同时持有锁以进行只读访问的工具
- 无法实现非块结构化锁定规程,因为必须在获取内部锁的同一块中释放内部锁
- 线程可以尝试中断地获取锁李>
- 线程可以为尝试获取锁提供超时值李>
- 支持读/写锁–即,如果锁未锁定用于写入,则允许多个并发读卡器的锁李>
- 传统的等待/通知隐喻被扩展为允许条件(见下文)李>
- 对公平性的支持(如果有多个线程在等待一个锁,那么当锁可用时,它们将以先进先出的顺序获取)李>
- 锁定块范围之外的能力:例如,一个方法可以将锁定对象传递给另一个线程李>
- 例如,可以查询锁以确定它们当前是否有任何线程等待获取它们
ReentrantLock
Javadocs类中有一些简单的代码示例。否则我肯定谷歌是你的朋友。谢谢,这是很有见地的。