“同步”究竟是做啥的? [复制]

Posted

技术标签:

【中文标题】“同步”究竟是做啥的? [复制]【英文标题】:What does "synchronize" exactly do? [duplicate]“同步”究竟是做什么的? [复制] 【发布时间】:2014-11-01 13:59:57 【问题描述】:

我有一个听起来很基本的问题,但就是这样。正如 Java 中众所周知的那样,synchronize 关键字用于处理访问一个特定实例的多个线程。现在想象如果一个实例 A 有一个同步方法do()。这是否意味着如果一个线程 T1 执行了方法do() 并因此获得了 A 的锁,那么在 T1 释放锁之前没有其他线程将访问实例 A(即使其他方法没有同步)?或者这意味着所有未同步的方法(或代码块)都可以访问,除了特定的 do() 方法可能一次只能由一个线程执行?

【问题讨论】:

我在这里没有看到任何好的答案。有人链接到的较旧问题对 whywhen 使用 synchronized 有很好的答案,但对它的实际作用没有简明的答案。答案很简单:JVM 不允许两个线程同时在同一个对象上synchronize。这里的所有都是它的。请记住,同步实例方法在 this 上同步,而同步静态方法在类对象上同步,这就是您需要了解 synchronized 实际上做什么的全部内容。 【参考方案1】:

同步方法确保不会同时为多个对象实例调用此方法,并且在同步方法执行期间,所有关联的实例变量都会在开始执行该方法之前刷新。

【讨论】:

【参考方案2】:

如果 T1 获得方法 do() 的锁定,即方法在同步块下。 和程序的其他部分说方法display() 不同步,那么其他线程可以访问此方法。 所以你的 or 是正确的。

【讨论】:

【参考方案3】:

直接来自Java documentation:

在同一个对象上两次调用同步方法是不可能交错的。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

所以,你后面的解释是正确的。

【讨论】:

以上是关于“同步”究竟是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Android的@hide注解究竟是做啥的?

AVFoundation 的 AVAssetWriterInput 期望MediaDataInRealTime 属性究竟是做啥的?

Keras 的 ImageDataGenerator 中的剪切究竟是做啥的?

`ssh-keygen -A` 究竟是做啥的?

bind_param() 中的第一个参数究竟是做啥的?

Android虚拟设备管理器下的“擦除数据”功能究竟是做啥的