2012-08-13 76 views
0

如果我使用​​,那么正在同步的对象必须是staticJava - 同步方法/块

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

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

+0

什么哟意思*静态*? – 2012-08-13 03:18:42

+0

引用对象的字段可能是“静态”的,而不是对象本身。 – 2012-08-13 04:15:09

回答

1

在过度轻视这种风险:

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

  2. 一般情况下,同步上代表组资源的东西:

    • 如果组资源的全部对象实例数据(非静态的),那么它是可以接受的在拥有数据的对象上进行同步。(如果那个对象不是'这个',问自己很多问题!)。

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

    • 对于任何给定的资源集合总是锁定相同的东西。这确保线程竞争相同的资源集合正在相互协调。

  3. 如果你正在考虑两个这样的资源集的,不能有任何一个项目属于两个集合。如果是这种情况,他们必须成为一个单一的资源集合

  4. 如果在同一个对象的方法无法从集标识的资源的竞争(读或写)为任何(1),则该方法可能无法需要同步。然而,如果该方法将被同时使用则认为:

    • 如果这样的方法从另一组资源的确实访问数据,那么将需要同步到集。参见(3)。

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

+0

谢谢!这澄清了一切。 – user547453 2012-08-13 05:45:37

+0

Richard ......我有另一个问题....是否有可能在我锁定的对象中存在其他非同步方法,并且其他线程是否可以访问它们? – user547453 2012-08-13 05:53:03

+0

@ user547453编辑回答您的最后一个问题。 – 2012-08-13 06:00:43

0

不一定。

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

1

对象不能是静态或非静态的:该属性仅适用于变量。所有对象同样生活在堆上,直到他们不能通过从“根”的引用而到达,不再是

对于同步,我们需要对象本身(而不是持有引用的变量),所以如果对这些对象的引用是由静态,非静态或局部变量持有的话,它们没有区别。

1

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

1.​​是用于当2以上线程访问相同的对象的关键字。

2.同步的目的是防止重要数据的国家。

3.object具有Lock and a Key,所以以保护数据这是一个instance variable,一个object's key被使用。

4.类似地,以保护State of the Data这是static,即(类的数据),class's key被使用。

+0

谢谢库马尔.........。 – user547453 2012-08-13 05:55:04

+0

欢迎您 – 2012-08-13 09:43:36

0

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