单个线程的Java同步方法

时间:2014-01-22 06:58:42

标签: java multithreading

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

,如果涉及单个线程,则不需要同步。

始终指定线程安全策略

实际上你永远不会知道将来如何使用你所写的课程。因此,明确说明您的政策总是更好。因此,如果将来有人试图以多线程方式使用它,那么他们就会意识到其含义。

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

答案 3 :(得分:1)

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

Synchronized方法用于阻止多个线程之间的共享资源。

因此,无需为单线程应用同步

答案 4 :(得分:1)

请考虑您正在设计电影票务卖家应用程序。让我们放弃目前提供的所有技术功能,以便可视化问题。

该节目只剩下一张票,有5个不同的柜台卖票。考虑有两个人试图在柜台购买节目的最后一张票。 考虑您的应用程序工作流程

  
      
  1. 您会详细了解买家,他的名字和信用卡   数。 (这是读操作)
  2.   
  3. 然后你会发现这个节目剩下多少票(这个   又是一个读操作)
  4.   
  5. 然后你用信用卡预订机票(这是写的   操作)
  6.   

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

客户1和客户2的详细信息将在第2步之前阅读。两者都将尝试预订机票,并且两个机票都将被预订。

如果将其修改为

  
      
  1. 您会详细了解买家,他的名字和信用卡   数。 (这是读操作)
  2.         

    Synchronize

         
        
    1. 然后你会发现节目剩余的票数(这是   再一次阅读操作)
    2.   
    3. 然后你用信用卡预订机票(这是写的   操作))
    4.   

由于线程竞争条件,没有机会超额预订节目。

现在,考虑一下这个例子,你绝对知道只有一个人预订门票。无需同步。

  

这里的售票员将是你的单线程   应用

我试图以非常简单的方式提出这个问题。您可以在DB上放置框架和约束来避免这种简单的场景。但答案的目的是证明为什么线程同步的理论,而不是避免它的方式的能力。