爪哇中的对象级别锁定与类级别锁定

同步可以将对共享资源的访问限制为仅一个线程。当两个或多个线程需要访问共享资源时,必须采用某种机制,使得共享资源将仅由一个线程使用。我们可以实现它的过程称为同步。

为什么需要同步?

让’借助示例了解这一点。
让’s表示您想计算针对特定URL的请求数。如果您同时收到两个请求,则计数可能不一致。

没有同步:

 

例如:
线程T1看到count为20并将其递增为21。同时,线程t2还将count为20并将其递增为21。这表明计数变得不一致。

使用同步:

您可以使用两种方法来实现同步。

  • 同步方法
  • 同步块

您不能与实例或类变量同步使用。

同步方法

您可以使整个IncrementCount()方法同步,因此没有两个线程可以并行访问它。

例如:
线程T1看到count为20,然后将其增加到21。同时,线程t2现在看到count为21,并将其增加到22。

同步块

您可以使用块在incrementCount()方法中同步关键部分,因此没有两个线程可以同时访问块。

例如:
线程T1的计数为20并将其递增为21。同时,线程t2现在将计数为21并将其递增为22。

爪哇中有两种锁定类型。

  • 对象级锁定
  • 类级别锁定

对象级别锁定:

对象级锁定意味着您要同步非静态方法或块,以便该实例一次只能由一个线程访问。如果要保护非静态数据,则使用它。
您可以通过执行以下操作来实现对象级别锁定。

使方法同步:

使用同步块并对此进行锁定:

使用同步块并锁定其他对象:

类级别锁定:

类级锁定意味着您要同步静态方法或块,以便整个类只能由一个线程访问。如果您有10个类的实例,则只有一个线程一次只能访问一个方法或任何一个实例的块。如果要保护静态数据,则使用它。

这可以通过以下方式实现:

使静态方法同步:

使用同步块并锁定.class:

使用同步块并锁定其他静态对象:

两个线程可以同时执行静态和非静态方法吗?

是的,由于两个线程将获得对不同对象的锁定,因此可以并发执行它们而不会出现任何问题。

如果一个类的方法是同步的,而同一类的其他方法是不同步的?它们可以由两个线程同时执行吗?

是的,因为一个线程需要锁才能进入同步块,而第二个线程将执行非同步方法’不需要任何锁定,因此可以并发执行。

从另一个同步方法调用同步方法是否安全?

是的,从另一个同步方法中调用同步方法是安全的,因为当您调用同步方法时,您将锁定 这个 对象,并且当您调用同一类的另一个同步方法时,可以安全执行,因为它已经锁定了 这个 object.
例如:

您实际上是在这样做。

在这里,如果有任何线程从method1调用method2,它将已经锁定 这个 对象,因此可以安全执行。


导入联系人

您可能还喜欢:

相关文章

  • 获取Java中的线程ID
    9月30日

    获取Java中的线程ID

    在本文中,我们将学习获取Java中正在运行的线程的线程ID。 Id是在线程创建时生成的唯一正数。该ID在线程的生存期内保持不变。线程终止时,其ID可用于引用另一个线程,但是[…]

  • 爪哇中的ArrayBlockingQueue
    9月19日

    爪哇中的ArrayBlockingQueue

    在本文中,我们将了解Java并发队列BlockingQueue。然后我们将深入其中’其中之一的实现ArrayBlockingQueue。什么是BlockingQueue BlockingQueue接口是在Java 5中并发API下引入的,它表示一个线程安全的队列,可以在其中添加和删除元素。我们可以有 […]

  • 将Java程序延迟几秒钟
    12月11日

    将Java程序延迟几秒钟

    在这篇文章中,我们将看到如何将Java程序延迟几秒钟。在很多情况下,我们需要等待其他任务完成,因此我们需要延迟Java程序。有多种方法可以延迟Java程序的执行。使用Thread.sleep Sleep方法会使当前线程暂停[…]

  • 29 May

    如何使用Java中的线程打印偶数和奇数

    在本文中,我们将看到如何使用Java中的线程打印偶数和奇数。另请参见:如何在Java中使用3个线程打印序列问题您将获得两个线程。您需要使用一个线程打印奇数,而使用另一线程打印偶数。您需要以自然顺序打印[…]

  • 爪哇中的wait(),notify()和notifyAll()
    10月22日

    为什么在对象类中使用wait(),notify()和notifyAll()方法

    在这篇文章中,我们将看到为什么wait(),notify()和notifyAll()方法在对象类中而不在线程类中。这是最常问到的Java多线程面试问题之一。您可能知道wait(),notify()和notifyAll()方法在Object类中,您知道相同的原因吗?让’s […]

  • 爪哇中的自定义BlockingQueue
    10月16日

    爪哇中的自定义BlockingQueue实现

    在本文中,我们将看到如何创建自己的自定义BlockingQueue。这是最常被问到的Java面试问题之一。您需要实现自己的BlockingQueue。这个问题有助于面试官对多线程概念有所了解。这是BlockingQueue的简单实现。我们将使用数组将元素存储在[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。