如果我有两个线程A和B使用相同的类C.java
如果线程A使用同步方法(synchro()
)访问使用另一个类方法(myMethod()
)会发生什么并且在1ms或者减去线程B之后尝试使用myMethod()
?他会等到线程A完成或访问myMethod()
?线程A和线程B使用相同的类实例。
答案 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的长度始终是偶数)。如果一个线程必须暂时中断不变量(例如,首先向列表添加一个东西,然后添加另一个),并且如果它看到破坏的不变量,其他一些线程将崩溃并刻录;然后你需要同步。
第一个线程仅在同步块内部中断了不变量,并且当在同一个对象上同步时,任何其他线程在数据中看起来。这样,看起来永远看不到破碎状态下的不变量。