java - C++(可能还有 Java)如何为同步锁定对象?

标签 java c++ synchronization locking

当对象被锁定在 C++ 和 Java 等语言中时,实际上是在低级别上)这是执行的吗?我认为这与 CPU/缓存或 RAM 无关。我最好的猜测是这发生在操作系统的某个地方?它会在执行上下文切换的操作系统的同一部分内吗?

我指的是锁定对象、同步方法签名 (Java) 等。

答案可能取决于哪种特定的锁定机制?

最佳答案

锁定涉及同步原语,通常是互斥锁。虽然天真地说互斥量只是一个表示“锁定”或“未锁定”的 boolean 标志,但问题在于细节:必须以原子方式读取、比较和设置互斥量值,以便多个线程尝试获取同一个互斥量。 '破坏它的状态。

但除此之外,指令必须正确排序,以便程序以正确的顺序看到互斥变量的读写效果,并且没有线程在不应该进入临界区时无意中进入临界区因为它没有及时看到锁更新。

内存访问排序有两个方面:一个是由编译器完成的,如果认为这样更有效,编译器可能会选择重新排序语句。防止这种情况相对微不足道,因为编译器知道什么时候必须小心。更困难的现象是 CPU 本身在内部可能会选择对指令重新排序,并且在出于锁定目的访问互斥变量时必须防止这样做。这需要硬件支持(例如,导致管道刷新和总线锁定的“锁定位”)。

最后,如果你有多个物理 CPU,每个 CPU 都有自己的缓存,在任何执行指令取得进一步进展之前,将状态更新传播到所有 CPU 缓存变得很重要。这又需要专门的硬件支持。

如您所见,同步是一项(可能)昂贵的业务,它确实阻碍了并发处理。然而,这只是您为拥有多个独立上下文执行工作的单个内存块所付出的代价。

关于java - C++(可能还有 Java)如何为同步锁定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507487/

相关文章:

java - 如何忽略级别@RequestMapping()而直接调用方法级别@RequestMapping()?

java - 什么时候对象符合垃圾收集器的条件?

java - 为什么? "Always declare user defined exceptions as final"

c++ - 将指针转换为shared_ptr

java - 如果 synchronized 创建一个 happen-before 关系并防止重新排序,为什么 DCL 需要 volatile

java - Apk 扩展文件 - 应用程序许可 - 开发者帐户 - NOT_LICENSED 响应

c++ - MouseHookProc 和 Sleep()

c++ - 从googletest中的派生夹具派生夹具

java - Symmetricds 动态更改文件同步的源基目录

sql - 从Azure数据库到Azure SQL数据仓库的实时数据同步?