volatile
volatile的作用
- 保证线程可见性(堆内存中)
- MESI(缓存一致性协议)CPU级缓存一致性
- 禁止指令重排(CPU)
synchronized 底层实现
- 早期synchronized是重量级锁,需要去系统申请锁,效率非常低
- JavaSE1.6之后引入 偏向锁–》自旋锁–》重量级锁
- 偏向锁:只有一个线程访问的时候给object对象头上markword记录这个线程,内部实现的时候只记录的线程ID
- 执行时间短、线程数少可以用自旋锁
- 执行时间长、线程数多可以用重量级锁
volatile和synchronized区别
- volatile 是变量修饰符,使一个变量在多线程间可见;synchronized是可以修饰类、方法、变量、代码块。
- volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞
- volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
本文探讨了volatile关键字在多线程环境中的作用,包括保证线程可见性、遵循缓存一致性协议以及禁止指令重排。同时,介绍了synchronized的优化历程,从早期的重量级锁到现在的偏向锁、自旋锁等。volatile与synchronized的主要区别在于,volatile不造成线程阻塞,而synchronized可能会。此外,volatile变量不会被编译器优化,而synchronized变量可以。总结了两者的应用场景及选择依据。
8561

被折叠的 条评论
为什么被折叠?



