《深入理解JAVA虚拟机》12.Java内存模型与线程

一、硬件的效率与一致性

        处理器、高速缓存、主内存间的交互关系,如下图
 

二、Java内存模型

 
1)主内存与工作内存
  • 主内存:所有的变量都存储在主内存。
  • 工作内存:每个前程都有自己的工作内存,保存了被该线程使用到的变量的主内存副本拷贝。
        线程、工作内存、主内存的交互关系,如下图
2)内存间的交互操作(操作:作用域,作用)
  • lock(锁定):主内存,把一个变量标识为一个线程独占状态。
  • unlock(解锁):主内存,把一个处于宋丁状态的变量释放出来。
  • read(读取):主内存,把一个变量从主内存传输到工作内存。
  • load(载入):工作内存,把read操作从主内存得到的变量值放入工作内存的变量副本中。
  • use(使用):工作内存,把工作内存中的一个变量传递给执行引擎。
  • assign(赋值):工作内存,把一个从执行引擎接收到的值赋值给工作内存变量。
  • store(存储):工作内存,把工作内存中的一个变量传送到主内存。
  • write(写入):主内存,把store操作从工作内存得到的变量值放入主内存的变量中。
        
        规则:
  • read与load必须一起使用,store与write必须一起使用。
  • assign赋值后必须同步回主内存。
  • 没有发生过assign,则不允许从工作内存同步回主内存。
  • 变量只能在主内存诞生。
  • 一个变量同一时间只允许一个线程对其lock。
  • 如果对一个变量执行了lock操作,那么会清空工作内存中该变量的值。
  • 没有lock的变量不允许unlock,也不允许unlock其他线程lock的变量。
  • unlock变量前,需要将变量同步回主内存。
 
3)volatile型变量特殊规则
        volatile语义
  • 保证变量对所有线程的可见性
  • 禁止指令重排序优化
 
4)原子性、可见性、有序性
  • 原子性:synchronize使用字节码指令monitorenter与monitorexit来实现,其底层隐式使用了lock、unlock;其他一些简单的原子性操作基于read、load、use、assign、store、write实现。
  • 可见性:volatile、synchronize、final都具有可见性。其中synchronize的可见性通过“unlock变量前,需要将变量同步回主内存”规则获得。final修饰的变量在构造后就可被其他线程访问(未发生this逃逸);
  • 有序性:volatile、synchronize
 

三、Java与线程

 
1)线程的实现
        实现线程的方式:使用内核线程实现、使用用户线程实现、使用用户线程加轻量进程混合实现。
        Java线程的实现:一条java线程映射到一条轻量级进程中。
 
2)Java线程调度:使用抢占式调度,每个线程由系统分配执行时间,线程切换也不由线程本身来决定。
 
3)线程状态转换
new:线程创建还未启动。
new->runnable:线程start()启动。
runnable->terminated:线程run()运行完成。
runnable->blocked:线程正在等待synchronize锁。排它锁
blocked->runnable:其他线程释放了synchronize锁,该线程获取到了锁。
runnable->waiting:Object.wait()、Thread.join()、LockSupport.park()。
waiting->runnable:notify()、notifyAll()。
runnable->timed_waiting:Thread.sleep(xxx)、Object.wait(xxx)、Thread.join(xxx)、LockSupport.parkNanos(xxx)、LockSupport.parkUntil(xxx)。
timed_waiting->runnable:notify()、notifyAll()、等待时间到期。
runnable又可分为running和ready:
running->ready:线程调度、Thread.yield()。
ready->running:线程调度。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值