操作系统中的互斥和JVM中的互斥
前几天再写synchronized的JVM实现时候,想起如果是2个线程同时想获得对象锁,即修改对象头的lock位时候,同时发现对象锁可用,同时修改lock的值,天了噜想想真是太可怕,想解决互斥却在解决方法中也有互斥的问题。后来发现: 任何互斥尝试必须基于一些基础硬件的互斥! 任何互斥尝试必须基于一些基础硬件的互斥! 任何互斥尝试必须基于一些基础硬件的互斥! 重要的话要说3遍!! 那我们来看看硬件的支持吧。 1、中断禁用 在单处理器中,并发进程不能同时执行,只能交替。因此要保证互斥,只需要保证一个进程不被中断就行,这种能力可以通过系统内核启用中断和禁止中断定义的原语实现。 禁用中断 临界区 启用中断 这种方法代价很高,因为处理器只能交替执行程序。还有个问题对于多处理器并没有什么用。 2、专用机器指令 在多处理器中,所有处理器都是共享内存。所以要保证互斥,在硬件级别上,对存储单位的访问要排斥对相同单位的其他访问。基于这一点,处理器设计者设计了一些机器指令,来保证两个动作的完整性,如我们喜闻乐见的compareAndSwap。 机器指令方法使用了忙等待。可能饥饿,导致某些进程无限期进入临界区。最重要的是可能产生死锁,假设进程P1通过CAS进入临界区,但是在临界区的时候被迫中断把处理器让给优先级别更高的P2,如果P2想使用同一资源,由于互斥机制,那么P2将永远无法进入临界区。