Java - 同步方法/块

时间:2012-08-13 03:15:54

标签: java multithreading static synchronized

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

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

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

5 个答案:

答案 0 :(得分:1)

对象不能是静态的或非静态的:此属性仅适用于变量。所有对象都同样存在于堆中,直到它们无法通过" root"的引用到达。了。

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

答案 1 :(得分:1)

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

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

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

3。每个object都有Lock and a Key,因此要保护数据 instance variableobject's key使用1}}。

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

答案 2 :(得分:1)

冒着过分琐碎的风险:

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

  2. 通常,在代表资源集的内容上进行同步:

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

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

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

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

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

    • 如果此类方法确实从其他资源集访问数据,则需要将其同步到该集合。

    • 见(3)。

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

答案 3 :(得分:0)

不一定。

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

答案 4 :(得分:0)

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