我无法理解synchronized关键字。据我所知,它用于确保只有一个线程可以同时访问synchronized方法/块。那么,如果只有一个线程调用它们,有时候有理由让某些方法同步吗?
答案 0 :(得分:4)
如果您的程序是单线程的,则无需同步方法。
另一种情况是你编写一个库并指出它不是线程安全的。然后,用户将负责处理可能的多线程使用,但您可以在没有同步的情况下编写所有内容。
答案 1 :(得分:2)
如果您确定您的类将始终在单线程下使用,则没有理由使用任何同步方法。但是,现实是 - Java本质上是多线程环境。在某些时候,有人会使用多个线程。因此,无论哪个类需要线程安全,都应该有足够的同步方法/同步块来避免问题。
答案 2 :(得分:2)
否,如果涉及单个线程,则不需要同步。
实际上你永远不会知道将来如何使用你所写的课程。因此,明确说明您的政策总是更好。因此,如果将来有人试图以多线程方式使用它,那么他们就会意识到其含义。
指定线程安全策略的最佳位置是JavaDocs。始终在 JavaDocs 中指定您创建的类是否是线程安全的。
答案 3 :(得分:1)
当两个或多个线程需要访问shared resource
时,他们需要某种方法来确保资源一次只能由一个线程使用。
Synchronized方法用于阻止多个线程之间的共享资源。
因此,无需为单线程应用同步
答案 4 :(得分:1)
请考虑您正在设计电影票务卖家应用程序。让我们放弃目前提供的所有技术功能,以便可视化问题。
该节目只剩下一张票,有5个不同的柜台卖票。考虑有两个人试图在柜台购买节目的最后一张票。 考虑您的应用程序工作流程
- 您会详细了解买家,他的名字和信用卡 数。 (这是读操作)
- 然后你会发现这个节目剩下多少票(这个 又是一个读操作)
- 然后你用信用卡预订机票(这是写的 操作)
醇>
如果这个逻辑不同步,会发生什么?
客户1和客户2的详细信息将在第2步之前阅读。两者都将尝试预订机票,并且两个机票都将被预订。
如果将其修改为
- 您会详细了解买家,他的名字和信用卡 数。 (这是读操作)
醇>
Synchronize
(
- 然后你会发现节目剩余的票数(这是 再一次阅读操作)
- 然后你用信用卡预订机票(这是写的 操作))
醇>
由于线程竞争条件,没有机会超额预订节目。
现在,考虑一下这个例子,你绝对知道只有一个人预订门票。无需同步。
这里的售票员将是你的单线程 应用
我试图以非常简单的方式提出这个问题。您可以在DB上放置框架和约束来避免这种简单的场景。但答案的目的是证明为什么线程同步的理论,而不是避免它的方式的能力。