【问题标题】:Java - synchronized method/ blockJava - 同步方法/块
【发布时间】:2012-08-13 03:15:54
【问题描述】:

如果我使用synchronized,那么正在同步的对象是否必须是static

编辑: 我的意思是说对对象的引用必须是静态的。我注意到我正在阅读的一个示例表明,为了让线程在类 A 中使用同步方法,那么对类 A 的引用必须是静态的。

所以,我想知道将对象的引用设为静态是否是一种规则,以便所有调用同步方法的线程都使用相同的实例副本。在我的示例中,同步方法用于从 1 计数到 10。因此,访问此同步方法的每个线程都应从 1 计数到 10。我在没有静态的情况下尝试过,结果不正确。

【问题讨论】:

  • 引用对象的字段可能是static,而不是对象本身。

标签: java multithreading static synchronized


【解决方案1】:

冒着过于琐碎的风险:

  1. 检查代码并确定将由将在并发线程上运行的代码访问的资源或数据集要考虑的代码可能跨越多个方法,可能是类。

  2. 一般来说,同步代表资源集的东西:

    • 如果 资源集 都是对象实例数据(非静态),则可以在拥有数据的对象上进行同步。(如果那样的话对象不是“this”,要问自己很多问题!)。

    • 如果资源集的任何部分是静态类数据,那么您必须在代表静态数据的内容上进行同步。这可能是@ 987654322@ 本身。 (也知道原始值不是对象)。

    • 对于任何给定的资源集,始终锁定相同的事物。这可确保线程竞争相同的资源集 相互协调。

  3. 如果您正在考虑两组这样的资源集,则不能有任何一项同时属于这两组。如果是这种情况,它们必须成为一个单独的资源集

  4. 如果您在同一对象中的方法不竞争(读取或写入)来自 (1) 中标识的资源集 中的任何东西,则该方法可能不需要同步。但是,如果该方法将同时使用,那么请考虑:

    • 如果这样的方法确实从另一个资源集访问数据,那么它需要同步到那个资源集。

    • 参见 (3)。

Read this to understand how the sychronized keyword works for static vs instance methods

【讨论】:

  • 谢谢!这澄清了一切。
  • Richard...我还有一个问题....我锁定的对象中是否可以有其他非同步方法,其他线程是否可以访问它们?
【解决方案2】:

对象不能是静态或非静态的:此属性仅适用于变量。所有对象都平等地存在于堆中,直到它们无法通过“根”的引用到达

为了进行同步,我们需要对象本身(而不是保存引用的变量),因此对这些对象的引用是否由静态、非静态或局部变量保存没有区别。

【讨论】:

    【解决方案3】:

    它的不是object静态或非静态,它是其状态受到并发问题保护的数据。

    1. synchronized2个或更多线程访问同一个对象时使用的关键字。

    2. 同步是为了保护关键数据的状态。

    3.每个object都有一个Lock and a Key,所以为了保护数据是一个instance variable,使用object's key。 p>

    4.同样为了保护State of the Data,即static,即(类数据),使用class's key

    【讨论】:

      【解决方案4】:

      不一定。

      如果您正在构建一个网络应用程序(例如)并且每个客户端会话都在处理特定于会话的对象列表(例如,每个用户的书籍列表),那么您的线程可以阅读您的列表当我的线程正在更新我的图书列表时,图书数量。

      【讨论】:

        【解决方案5】:

        我们不同步对象。我们同步一个代码块(可以是synchronized 块中的方法或代码),以便一次只有一个线程可以通过该块。 Object 提供了锁,如果一个线程已经在该代码块中运行,该锁用于防止其他线程进入该代码块。关于线程同步,对象的引用是否为static 无关紧要,但还要注意不能在静态方法中使用非静态变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-01
          • 2014-07-11
          相关资源
          最近更新 更多