![](/img/trans.png)
[英]what happens when you call a synchronized from a non-synchronized method in java
[英]When I call a method not synchronized from a synchronized what appen?
如果我有两个使用相同类C.java
线程A和B,那么如果线程A使用访问的同步方法( synchro()
)使用另一个类方法( myMethod()
),并且在1ms或减去线程B之后尝试执行操作,将会发生什么情况?使用myMethod()
吗? 他将等到线程A完成或它访问myMethod()
吗? 线程A和线程B使用相同的类实例。
同步不是隐式可传递的 。 它仅仅是执行代码块的对象上的锁。 它不会锁定在代码块内使用的对象。
线程B将有权访问非同步方法。 由于未同步,因此线程B无需等待获取对象监视器。
隐式互斥锁仅在方法synchro()
引入,而不会在myMethod()
引入,因为myMethod()
不同步。 因此,将无法在多个线程之间同步访问myMethod()
。
它将访问它。
仅同步方法或同步块不能同时执行: 同步方法
没有所谓的同步方法。
在我之后重复一遍: 没有同步方法之类的东西 。
当您编写此代码时:
synchronized Foobar myFunk() { ... }
那只是语法糖,使您不必编写以下代码:
Foobar myFunk() {
synchronized(this) { ... }
}
但是第二个让事情变得更加明显:不是同步的方法 ,而是对象 。
JVM不允许两个不同的线程同时同步同一对象。 这就是全部 。 同步对象不会“锁定”该对象(其他线程仍可以对其进行修改)。 同步对象不会阻止其他线程调用相同的方法。 这样做是为了防止其他线程同时同步同一对象。
您如何使用该功能取决于您。
通常,您可以使用它来保护不变量 。 不变性是您对某个值或一组值进行的断言。 (例如,列表L的长度始终为偶数)。 如果一个线程必须暂时破坏不变式(例如,首先将一件事添加到列表中,然后再添加另一件事),则其他线程如果看到破坏的不变式,则将崩溃并燃烧; 那么您需要同步。
第一个线程仅在同步块内时打破不变式,而其他任何线程仅在同一对象上同步时才查看数据。 这样,外观就永远看不到处于破碎状态的不变性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.