|
| 1 | +#第2章 Java并发机制的底层原理 |
| 2 | + |
| 3 | +##1. valatile关键字 |
| 4 | + |
| 5 | +`valatile`是轻量级的`synchronized`,在多处理器开发中保证了共享变量的`可见性`。 |
| 6 | + |
| 7 | +>可见性是指当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 |
| 8 | +
|
| 9 | +如果`valatile`关键字使用恰到,它的使用和执行成本会比`synchronized`底,因为它不会引起线程上下文的切换和调度。 如果一个字段被声明成`valatile`,Java线程内存模型确保所有线程看到这个变量的值是一致的。 |
| 10 | + |
| 11 | +##2. synchronized关键字 |
| 12 | + |
| 13 | +Java中的每一个对象都可以作为锁。 |
| 14 | + |
| 15 | +- 对于普通同步方法,锁的是当前实例对象。 |
| 16 | +- 对于静态同步方法,锁的是当前类的Class对象。 |
| 17 | +- 对于同步方法块,锁的是`synchronized`括号里面配置的对象。 |
| 18 | + |
| 19 | +当一个线程试图访问同步代码块时候,首先线程必须得到锁,退出或抛出异常时必须释放锁。 |
| 20 | + |
| 21 | +##3. Java对象头 |
| 22 | + |
| 23 | +`synchronized`用的锁是存在Java对象头里面的,如果对象是数组类型,则虚拟机用3个字宽存储对象头,如果对象是非数组类型,则用2字宽存储对象头。 |
| 24 | + |
| 25 | +##4. Java中的锁 |
| 26 | + |
| 27 | +**锁的优缺点总结** |
| 28 | + |
| 29 | +| 锁| 优点| 缺点| 适用场景| |
| 30 | +| :------:| :----------------------------------------------------------:| :----------------------------------------------:| :----------------------------------:| |
| 31 | +| 偏向锁| 加锁和解锁不需要额外的开销,和执行非同步方法相比仅存在纳秒级的差距| 如何线程之间存在锁竞争,会带来额外的锁撤销的消耗| 适用于只有一个线程访问同步块场景| |
| 32 | +| 轻量级锁| 竞争的线程不会阻塞,提高了程序的响应速度| 如果始终得不到锁竞争的线程,使用自旋会消耗CPU| 追求响应时间、头同步块执行速度非常快| |
| 33 | +| 重量级锁| 线程竞争不使用自旋,不会消耗CPU| 线程阻塞,响应时间缓慢| 追求吞吐量,同步块执行速度较长| |
| 34 | + |