Java并发学习简单记录-volatile,synchronized,原子性,Java内存模型基础等

volatile保证了java线程内存模型中的所有线程所看到的的某个变量的值是一致的。

lock指令在多核处理器下会引发两件事:

  1. 将当前处理器缓存行的数据写回到系统内存。
  2. 这个写回内存的操作会使在其他cpu里缓存了该内存地址的数据无效。 如果生声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀指令。

缓存一致协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己的缓存行的对应的内存地址被修改,就会重新从系统内存中把数据读到处理器缓存中。

volatile两条实现原则: 1.Lock前缀指令会引起处理器缓存写回到内存。 2.一个处理器的缓存回写到内存会导致其他处理器的缓存无效。

synchronized实现同步的基础:Java中的每个对象都可以作为锁。 具体表现为以下三种形式: 1.普通方法,锁是当前实例对象。 2.静态同步方法,锁是当前类的Class对象。 3.同步方法块,锁是synchronized括号里配置的对象。

锁:只能升级不能降级,目的是为了提高获得锁和释放锁的效率。

实现原子性的方式: 1.总线锁保证原子性,处理器在总线上传播一个Lock信号,其他处理器请求将会被阻塞,该处理器可以独占共享内存。 2.缓存锁定保证原子性,处理器缓存内存区域到自己的缓存行,根据缓存一致性协议,其他处理器不能同时缓存该内存区域到自己的缓存行。

Java内存模型基础: 线程通信方式:共享内存和消息传递。

volatile内存语义的实现是JMM(Java 内存模型)针对编译器对于volatile变量操作指令的重排序,其中重排序是通过插入内存屏障去实现的。

Daemon线程 是一种支持型线程,主要用作程序中的后台调度以及支持性工作,Daemon属性需要在线程启动之前设置。 在构建daemon线程的时候,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑,因为如果JVM中没有非Daemon线程,虚拟机需要退出,JVM中的Daemon线程都需要立即终止。所以finally块中的内容不一定会被执行。

转载于:https://my.oschina.net/u/2374227/blog/1924856

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值