1. 操作系统有哪些方法实现同步
- 互斥量
phread_mutex_t(互斥锁),发生竞争时,如果拿不到锁则睡眠 - 自旋锁
pthread_spin_t,如果拿不到锁则空转 - 信号量
用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
2. synchronized是不是自旋锁
- synchronized底层的系统调用使用的是phread_mutex_t,在膨胀为重量锁之后,有自旋方法
http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/87ee5ee27509/src/share/vm/runtime/objectMonitor.cpp
3. 互斥量
- 查看pthread_mutex_init函数定义
man pthread_mutex_init
- 初始化和销毁一个互斥量
- Java当中synchronized如果膨胀为重量锁(10),底层的同步或者锁机制使用的是mutex
4. 重量锁
- 为什么mutex是重量锁
因为mutex的特点是拿不到锁就sleep(),sleep属于系统调用,发生系统调用,就会进入内核态。