当我调用一个方法未同步的同步什么appen?

时间:2014-09-08 14:16:13

标签: java multithreading

如果我有两个线程A和B使用相同的类C.java如果线程A使用同步方法(synchro())访问使用另一个类方法(myMethod())会发生什么并且在1ms或者减去线程B之后尝试使用myMethod()?他会等到线程A完成或访问myMethod()?线程A和线程B使用相同的类实例。

5 个答案:

答案 0 :(得分:2)

同步不是隐式传递。它只是锁定对象以执行代码块。它不会锁定代码块中使用的对象。

答案 1 :(得分:1)

线程B可以访问未同步的方法。由于它未同步,因此线程B无需等待获取对象监视器。

答案 2 :(得分:0)

隐式互斥锁将仅针对方法synchro()引入,但不会针对myMethod()引入,因为myMethod()未同步。因此,myMethod()的访问不会在多个线程之间同步。

答案 3 :(得分:0)

它将访问它。

只有同步方法或同步块不能同时执行:Synchronized Methods

答案 4 :(得分:0)

没有同步方法。

在我之后重复:没有这样的东西作为同步方法。

当你这样写:

synchronized Foobar myFunk() { ... }

这只是语法糖,可以让你不必写这个:

Foobar myFunk() {
    synchronized(this) { ... }
}

但第二个更明显的是真实情况:它不是同步的方法,它是对象

JVM不允许两个不同的线程同时同步同一个对象。这意味着所有。同步对象不会锁定"对象(其他线程仍然可以修改它)。同步对象不会阻止其他线程调用相同的方法。它所做的只是阻止其他线程同时同步同一个对象。

您如何使用该功能取决于您。

通常,您可以使用它来保护不变量。不变量是一个断言,您可以使用某些值或某些值。 (例如,列表L的长度始终是偶数)。如果一个线程必须暂时中断不变量(例如,首先向列表添加一个东西,然后添加另一个),并且如果它看到破坏的不变量,其他一些线程将崩溃并刻录;然后你需要同步。

第一个线程仅在同步块内部中断了不变量,并且当在同一个对象上同步时,任何其他线程在数据中看起来。这样,看起来永远看不到破碎状态下的不变量。

相关问题