当前位置: 首页 > 知识库问答 >
问题:

什么是类级别、对象级别、显式和内在锁定?

邬安邦
2023-03-14

我一直在研究Java多线程概念。我看得越多,就越困惑。

现在我不明白Java中类级别、对象级别、显式锁定和内在锁定之间的区别。有人能告诉我是什么吗?此外,如果我能得到一些例子来理解,那将对我很有帮助。

共有3个答案

微生自怡
2023-03-14

“类级”锁定和“对象级”锁定是人为的想法,作者可能对Java的内部锁定的工作原理没有深入的了解。

类级锁定如下所示:

class Foobar {
    static synchronized void moo() { ... }
}

但是这个结构实际上只是一种速记方式:

class Foobar {
    static void moo() {
        synchronized (Foobar.class) { ... }
    }
}

还有对象级锁定,如下所示:

class Foobar {
    synchronized void baa() { ... }
}

只不过是以下内容的简写:

class Foobar {
    static void baa() {
        synchronized (this) { ... }
    }
}

所以实际上,在“类级”和“对象级”锁定之下,只有一个概念,即< code>synchronized块:

synchronized(objectReference) {...}

您只需要知道JVM不允许多个线程同时在同一个对象上同步。

当您想要保护的数据是全局数据时,在访问数据时同步一个全局的单例对象是有意义的。< code>Foobar.class是一个全局单例。

当您要保护的数据完全包含在某个对象实例中时,那么在与该实例关联的东西或实例本身(即this)上进行同步是有意义的。

马晓博
2023-03-14

当您使用“已同步”关键字时,它将使用内部锁或监视器。Java中的每个对象都有一个与之关联的固有锁。每当线程尝试访问同步的块或方法时,它都会获取该对象上的固有锁或监视器或对象级锁。对于静态方法,线程获取类对象上的锁。

public synchronized void doAtomicTransfer(){
  //enter synchronized block , acquire lock over this object.
  operation1()
  operation2();   
} // exiting synchronized block, release lock over this object.

固有锁定机制可能有一些功能限制,例如:

  • 无法中断等待获取锁的线程(可中断锁定)。
  • 如果不愿意永远等待它,就不可能尝试获取锁(尝试锁定)。一次只能有一个线程持有锁:例如,没有工具允许多个线程同时持有锁以进行只读访问。
  • 无法实现非块结构的锁定规则,因为内部锁必须在获取它们的同一块中释放。

显式锁在您需要克服内置同步的一些缺点的情况下很有用。特别是,它们具有以下特性:

  • 线程可以尝试中断地获取锁
  • 线程可以为尝试获取锁提供超时值
  • 支持读/写锁–即,如果未锁定锁进行写入,则允许多个并发读卡器的锁
  • 传统的等待/通知隐喻被扩展为允许条件(见下文)
  • 支持公平性(如果有多个线程正在等待锁,那么当锁可用时,它们会获取先进先出的顺序)
  • 锁定超出块范围的能力:例如,一个方法可以将锁定对象传递给另一个线程
  • 例如,可以查询锁以确定它们当前是否有线程等待获取它们
江超英
2023-03-14

当您在对象上使用同步或间接作为方法签名的一部分时,您正在创建一个内在锁。您依赖于与所有对象和类关联的内置锁。

在 Java 5 中,在包中提供了显式锁,该锁位于 java.util.concurrent.locks 中。最常用的类可能是重入锁。这些提供了使用固有锁的替代方法,并提供了固有锁无法实现的功能。

这种区别仅适用于内部锁。如果您有一个同步的静态方法,那么使用的内部锁将与类对象本身相关联。如果在对象实例上同步(或具有同步实例方法),则它将是一个对象级锁。

Brian Goetz的Java Concurrency in Practice是一本很好的书,它可以帮助我们理解Java中可怕的、令人困惑的多线程编程世界。

 类似资料:
  • 问题内容: 我一直在研究Java多线程概念。我越经历他们,我就越困惑。 现在,我还不了解Java中的类级别,对象级别,显式和固有锁定之间的区别。有人可以让我知道这是什么吗?另外,如果我可以理解一些示例,那对我也将非常有帮助。 问题答案: 显式与内在 当您在对象上使用或间接用作方法签名的一部分时,您正在创建内部锁。您依赖与所有对象和类关联的内置锁。 软件包中的Java 5+提供了显式锁。最常用的类可

  • 我在许多关于可重入锁的教程中看到,它们创建一个新的可重入锁并注入资源,可重入锁的锁定和解锁在try/finally块中调用。我不理解这个锁和线程中使用的资源之间的连接。下面是一个关于可重入锁的教程示例 资源代码 线程声明代码中使用的资源 有人能解释一下,这是如何防止多个线程同时访问给定的资源,从而导致争用情况的???这个可重入锁是在资源中创建对象级锁还是类级锁???

  • 我是Grails和Goovy的新手。我在这里查看了Grails框架文档以及关于乐观与悲观锁定的讨论 从文档中可以清楚地看出: > Grails默认使用乐观锁定。 可以关闭乐观锁定(通过使用version=false) 如果您关闭了乐观锁定,并担心并发更新时丢失数据,则必须启用悲观锁定(通过使用lock()方法) 我的问题: > < li> 似乎有3种模式。两个显式命名:乐观和悲观,另一个是隐式的—

  • 问题内容: 我在某处读过该元素的行为类似于两者。如果正确,可以有人举例说明吗? 问题答案: 的确,它们都是-或更确切地说,它们是“内联块”元素。这意味着它们像文本一样内联地流动,但也像块元素一样具有宽度和高度。 在CSS中,您可以设置一个元素以使其复制图像的行为*。 图像和对象也被称为“已替换”元素,因为它们本身不具有内容,因此该元素实际上被二进制数据替换。 *请注意,浏览器在技术上使用(如在开发

  • 公共类DoSomething{private static final Logger Logger=LoggerFactory.getLogger(DoSomething.class); 我试图创建一个LogMessage的对象。并在DoSomething类的方法中使用它。这是好的还是我应该移动方法中的行?