多线程理解杂记

个人理解:无锁线程安全的依据:利用volatile和final禁止重排序,

第二个操作位volatile写时或第一个操作位volatile读时, 不允许重排序

final基础类型:写不能排到构造函数之外。(保证别的线程引用该对象时,final变量已经被赋值,而非fianl则不保证)

final引用类型:写与引用不能重排序。注意溢出问题 构造函数  obj=this

多线程好处:减少上下文切换:无锁并发、CAS、最少线程、协程。

检查死锁 jstack -F pid

底层实现:

java代码--(编译)--》字节码--(加载)–》jvm–》cpu

实现依赖jvm和cup指令

volatile

cpu lock前缀指令:1、将处理器缓存写会内存。2、第一步操作导致其余缓存失效。

伪共享问题 缓存行为64字节  填充字节 1.8以后@Contend。

看缓存行大小 32字节 64字节,频繁写不适用。java7 重排序

synchronized   markword 记录锁

普通对象:锁的是对象实例

静态对象:Class对象

方法: 方法内所有对象

实现:

jvm monitor对象

cpu:monitorenter 和monitorexit

monitorenter 同步代码块开始 monitorexit 同步代码快结束

每个对象都有一个monitor对象 当同步代码遇到对象时会获取对象的monitor对象。

1.6 从轻到重:无锁-偏向锁-轻量级锁-重量级锁 锁只能升级 为了提高获得释放的效率 

偏向锁延迟-XX:BiasedLockingStartupDelayDelay=0

关闭偏向锁:-XX:UseBiasedLoking=false

轻量级锁:自旋锁竞争:不阻塞但消耗cpu,  释放轻量级锁如有竞争则升级为重量级锁

原子操作:

操作系统:1、总线锁 处理器占据总线锁 其余处理器阻塞。2、缓存锁:缓存到处理器内部 单缓存行

java:CAS 自旋CAS

存在问题:ABA:加版本号 1.5 Atomic包 

循环时间长:pause指令、只能保证一个共享变量:多个共享变量变为一个共享变量。

线程通信:共享内存和消息传递

线程同步:按照一定顺序进行,共享内存是显示控制,消息传递是隐示控制

重排序:处理器会对单线程无依赖的读写操作做重排序。适当的位置插入内存屏障指令进行阻止。处理器只禁止影响结果的重排序 即使存在依赖关系 如  b=null  b=set(b)  String a=b  后2步可能重排序。

第二个操作位volatile写时或第一个操作位volatile读时, 不允许重排序

Happens-before

如果一个程序结果需要对另一个程序结果可见,则要保证happens-before

long和double 64位 不保证原子性。

锁的释放和获取与volatile的读写具有相同的内存语义。

ReentankLock实现依赖于AQS volatile的state变量

公平锁获取: state的读 

非公平锁获取 是state的CAS

释放都是state的写。

courrent包实现:

共享变量设为 volatile ,然后CAS原子更新实现线程同步

final重排序规则

final基础类型:写不能排到构造函数之外。(保证别的线程引用该对象时,final变量已经被赋值,而非fianl则不保证)

final引用类型:写与引用不能重排序。注意溢出问题 构造函数  obj=this

双重检查锁:

当执行到第4步不为空时 仍会出现初始化不完整的情况。

1、加volatile即可。相当于第二步是volatile写 不允许重排序

2、静态内部类。初次加载就会被初始化。

线程状态:

new 初始 runnable 运行 blocked 阻塞  waiting 等待 timewaiting 超时等待 

sleep方法会清除中断标识位。

volatile 线程获取变量必须从共享内存获取,更改变量必须刷回共享内存。

调用notify方法,wait不会立即返回,而是等到调用notify方法的方法结束。

降级锁: 获得写锁 再获得读锁 然后释放写锁。保证数据可见性

condation接口与lock锁配合实现等待/唤醒功能 condation.await 和signal

signal唤醒等待队列中等待时间最长的线程(首节点)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值