繁体   English   中英

当我从同步中调用不同步的方法时,会出现什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM