【发布时间】:2014-01-22 06:58:42
【问题描述】:
我无法理解 synchronized 关键字。据我所知,它用于确保只有一个线程可以同时访问同步方法/块。那么,如果只有一个线程调用它们,有时是否有理由使某些方法同步?
【问题讨论】:
-
如果你只有一个线程,那么
No。 -
事实上,并不总是需要同步一个方法,即使有多个线程同时访问它。
标签: java multithreading
我无法理解 synchronized 关键字。据我所知,它用于确保只有一个线程可以同时访问同步方法/块。那么,如果只有一个线程调用它们,有时是否有理由使某些方法同步?
【问题讨论】:
No。
标签: java multithreading
如果您的程序是单线程的,则无需同步方法。
另一种情况是您编写了一个库并指出它不是线程安全的。然后,用户将负责处理可能的多线程使用,但您可以在不同步的情况下全部编写。
【讨论】:
如果您确定您的类将始终在单线程下使用,则没有理由使用任何同步方法。但是,现实是——Java 本质上是多线程环境。在某些时候,有人会使用多个线程。因此,任何需要线程安全的类都应该有充分同步的方法/同步块以避免出现问题。
【讨论】:
不,单线程就不需要同步了。
其实你永远不知道你写的一个类在未来会被别人如何使用。因此,最好明确说明您的政策。因此,如果将来有人尝试以多线程方式使用它,那么他们可以意识到其中的含义。
指定线程安全策略的最佳位置是在 JavaDocs 中。始终在 JavaDocs 中指定您正在创建的类是否是线程安全的。
【讨论】:
当两个或更多线程需要访问shared resource 时,它们需要某种方式来确保资源一次只能被一个线程使用。
同步方法用于阻塞多个线程之间的共享资源。
所以,不需要为单线程申请同步
【讨论】:
假设您正在设计一个电影票销售商应用程序。为了可视化问题,让我们放弃这些天提供的所有技术能力。
演出门票仅剩一张,有 5 个不同的柜台售票。考虑有 2 个人试图在柜台购买演出的最后一张票。 考虑您的应用程序工作流程是这样的
- 您获取买家的详细信息、他的姓名和他的信用卡
数字。 (这是读操作)- 然后您会发现该节目还剩多少张门票(此 又是一个读操作)
- 然后你用信用卡订票(这是写 操作)
如果这个逻辑不同步,会发生什么?
将读取客户 1 和客户 2 的详细信息,直到第 2 步。双方都将尝试预订机票,并且他们的机票都将被预订。
如果修改为
- 您获取买方的详细信息、他的姓名和他的信用卡 数字。 (这是读操作)
Synchronize(
- 然后您会发现该节目还剩多少票(这是 再次读取操作)
- 然后你用信用卡订票(这是写 操作))
由于线程竞争条件,不可能超额预订节目。
现在,考虑这个示例,您绝对知道只有 1 人预订门票。不需要同步。
这里的售票员将是您的单线程,以防您的 应用
我试图以一种非常简单的方式来说明这一点。为了避免这种简单的情况,您在数据库上放置了一些框架和约束。但答案的目的是证明为什么线程同步的理论,而不是避免它的方法的能力。
【讨论】: