【问题标题】:Java synchronized methods for a single thread单线程的 Java 同步方法
【发布时间】:2014-01-22 06:58:42
【问题描述】:

我无法理解 synchronized 关键字。据我所知,它用于确保只有一个线程可以同时访问同步方法/块。那么,如果只有一个线程调用它们,有时是否有理由使某些方法同步?

【问题讨论】:

  • 如果你只有一个线程,那么No
  • 事实上,并不总是需要同步一个方法,即使有多个线程同时访问它。

标签: java multithreading


【解决方案1】:

如果您的程序是单线程的,则无需同步方法。

另一种情况是您编写了一个库并指出它不是线程安全的。然后,用户将负责处理可能的多线程使用,但您可以在不同步的情况下全部编写。

【讨论】:

    【解决方案2】:

    如果您确定您的类将始终在单线程下使用,则没有理由使用任何同步方法。但是,现实是——Java 本质上是多线程环境。在某些时候,有人会使用多个线程。因此,任何需要线程安全的类都应该有充分同步的方法/同步块以避免出现问题。

    【讨论】:

      【解决方案3】:

      ,单线程就不需要同步了。

      始终指定线程安全策略

      其实你永远不知道你写的一个类在未来会被别人如何使用。因此,最好明确说明您的政策。因此,如果将来有人尝试以多线程方式使用它,那么他们可以意识到其中的含义。

      指定线程安全策略的最佳位置是在 JavaDocs 中。始终在 JavaDocs 中指定您正在创建的类是否是线程安全的。

      【讨论】:

        【解决方案4】:

        当两个或更多线程需要访问shared resource 时,它们需要某种方式来确保资源一次只能被一个线程使用。

        同步方法用于阻塞多个线程之间的共享资源。

        所以,不需要为单线程申请同步

        【讨论】:

          【解决方案5】:

          假设您正在设计一个电影票销售商应用程序。为了可视化问题,让我们放弃这些天提供的所有技术能力。

          演出门票仅剩一张,有 5 个不同的柜台售票。考虑有 2 个人试图在柜台购买演出的最后一张票。 考虑您的应用程序工作流程是这样的

          1. 您获取买家的详细信息、他的姓名和他的信用卡
            数字。 (这是读操作)
          2. 然后您会发现该节目还剩多少张门票(此 又是一个读操作)
          3. 然后你用信用卡订票(这是写 操作)

          如果这个逻辑不同步,会发生什么?

          将读取客户 1 和客户 2 的详细信息,直到第 2 步。双方都将尝试预订机票,并且他们的机票都将被预订。

          如果修改为

          1. 您获取买方的详细信息、他的姓名和他的信用卡 数字。 (这是读操作)

          Synchronize(

          1. 然后您会发现该节目还剩多少票(这是 再次读取操作)
          2. 然后你用信用卡订票(这是写 操作))

          由于线程竞争条件,不可能超额预订节目。

          现在,考虑这个示例,您绝对知道只有 1 人预订门票。不需要同步。

          这里的售票员将是您的单线程,以防您的 应用

          我试图以一种非常简单的方式来说明这一点。为了避免这种简单的情况,您在数据库上放置了一些框架和约束。但答案的目的是证明为什么线程同步的理论,而不是避免它的方法的能力。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-02-10
            • 2011-10-25
            • 2013-11-12
            • 2012-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多