0

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

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

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

4

5 回答 5

1

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

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

于 2012-08-13T04:19:30.230 回答
1

不是 static 或 non-staticobject而是其状态受到保护免受并发问题影响的数据。

1. synchronized是一个关键字,当2 个或多个线程访问同一个对象时使用。

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

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

4.类似地,为了保护State of the Datawhich is static,即(类数据),class's key被使用。

于 2012-08-13T04:22:32.993 回答
1

冒着过分轻视这一点的风险:

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

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

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

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

    • 对于任何给定的资源集,始终锁定相同的东西。 这确保了竞争同一组资源的线程彼此正确协调。

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

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

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

    • 见(3)。

阅读本文以了解sychronized关键字如何用于静态方法和实例方法

于 2012-08-13T05:42:43.983 回答
0

不必要。

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

于 2012-08-13T03:22:58.630 回答
0

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

于 2012-08-13T04:54:39.397 回答