1. vilatile,锁和原子操作
这三个是理解java并发的基础。
简单来说,vilatile修饰的变量,可以保证对其的改变所有线程可见,这个机制实际上也是依赖原子操作的;
锁,主要分为偏向锁,轻量级锁和重量级锁;资源消耗也是越来越大的。使用java的synchronized的关键字或者新的锁用法,都是在这三种锁中做选择,jdk6之后默认优先使用偏向锁,也可以通过UseBaisedLocking=false关闭偏向锁。使用偏向锁的依据,一个是客观事实,通常都是同一个线程获取锁;另一个也是考量一个应用是否有大量的锁竞争。具体jvm内部如何实现锁的,可参见相关讲解并发书籍的资料。
原子操作,cpu通过两种方式保证操作是原子的,一个是锁定总线,效率低下,锁定数据总线,其它cpu也不能读取或者写入数据了;一个是使用cpu的L1,L2,L3级缓存(把相关数据读进缓存,然后使用cas算法保证原子性)。在某些情况下,数据跨多个行,或者同时修改多个数据,可能还是要锁定总线才能实现。
返回头说vilatile的实现机制,也就是原子性操作之后,再通知关心这个值变化的其它cpu更新自己的缓存。
时间: 2024-10-15 04:05:00