“同步”究竟是做啥的? [复制]
Posted
技术标签:
【中文标题】“同步”究竟是做啥的? [复制]【英文标题】:What does "synchronize" exactly do? [duplicate]“同步”究竟是做什么的? [复制] 【发布时间】:2014-11-01 13:59:57 【问题描述】:我有一个听起来很基本的问题,但就是这样。正如 Java 中众所周知的那样,synchronize
关键字用于处理访问一个特定实例的多个线程。现在想象如果一个实例 A 有一个同步方法do()
。这是否意味着如果一个线程 T1 执行了方法do()
并因此获得了 A 的锁,那么在 T1 释放锁之前没有其他线程将访问实例 A(即使其他方法没有同步)?或者这意味着所有未同步的方法(或代码块)都可以访问,除了特定的 do()
方法可能一次只能由一个线程执行?
【问题讨论】:
我在这里没有看到任何好的答案。有人链接到的较旧问题对 why 和 when 使用synchronized
有很好的答案,但对它的实际作用没有简明的答案。答案很简单:JVM 不允许两个线程同时在同一个对象上synchronize
。这里的所有都是它的。请记住,同步实例方法在 this
上同步,而同步静态方法在类对象上同步,这就是您需要了解 synchronized
实际上做什么的全部内容。
【参考方案1】:
同步方法确保不会同时为多个对象实例调用此方法,并且在同步方法执行期间,所有关联的实例变量都会在开始执行该方法之前刷新。
【讨论】:
【参考方案2】:如果 T1 获得方法 do()
的锁定,即方法在同步块下。
和程序的其他部分说方法display()
不同步,那么其他线程可以访问此方法。
所以你的 or 是正确的。
【讨论】:
【参考方案3】:直接来自Java documentation:
在同一个对象上两次调用同步方法是不可能交错的。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。
所以,你后面的解释是正确的。
【讨论】:
以上是关于“同步”究竟是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
AVFoundation 的 AVAssetWriterInput 期望MediaDataInRealTime 属性究竟是做啥的?