Java并发编程——(一)

此文章为自己看书的后一些笔记,不具备学习价值,只能作为参考。如有异议,欢迎讨论,一起学习进步。

1.导致多线程并发数据不安全的原因:

         *1.线程操作一个共享变量,是在本地内存中。本地内存是每个线程私有的,多个线程之间不可见

          *2.代码实际执行时,会经过编译器和处理器的指令重排序。由于编译器和处理器只会遵守单线程的数据依赖,对多线程或多个处理之间,是不遵守数据依赖的。

 

2.volatile分析

    *1.volatile声明的变量,会保证这个变量对多线程内存的可见性,且在读写volatile变量的地方插入内存屏障,来禁止指令重排序的影响。

    *2.volatile变量在编译后,会生成一个lock指令。通过lock指令告诉处理器锁定总线。这样一个线程在操作volatile变量时,导致其他线程将不能访问主存。声言lock指令的线程在操作完volatile变量后,会强制刷新到主存中。再通过缓存一致性协议,当其他处理器或线程发现主存中有数据被修改且这个数据在自己的缓存行中,就会把自己的缓存行设为无效,在使用时将会强制重新去主存中读取。

不过,锁总线带来的性能损耗太大,现在一般的处理器都会锁缓存。缓存一致性将会禁止同时修改由两个以上处理缓存的数据,这也就实现了和锁总线一样的效果,但损耗更小,其他处理器在lock期间可以访问主存,只是不能访问被锁定的那部分缓存。当声言lock指令的线程操作完volatile变量后,后续的操作和上面锁总线一样。

注:当时这里有个地方不明白,既然处理器通过缓存一致性可以发现有数据被修改且该数据被缓存到自己的缓存行中,就会使自己的缓存行失效,那么要volatile何用,不用volatile,也会在修改共享变量时,让其他处理器缓存的数据无效啊。后来想想,是自己理解错了,其他处理通过缓存一致性协议来检查发现是否有共享变量修改,是在总线上检查,也就是到主存中的数据。如果一个处理修改了本地缓存中的共享变量却没有及时刷新到主存中,其他处理是不会发现的。而volatile的lock指令恰恰就是做的这个,将修改后的共享变量立即刷新到主存中去。

 提示:追加字节能够优化性能?假设有一个队列,里面元素都是用volatile修饰的。如果这个队列的头节点和尾节点加起来还不到64个字节大小,而一个64位处理器一个高速缓存行的大小是64个字节,那么头节点和尾节点将会被缓存到一个缓存行中。缓存行是处理缓存中操作的最小单元,那么一个线程在操作头节点出队时,其他线程将不能操作尾节点入队。

锁升级:无锁——>偏向锁——>轻量级锁——>重量级锁。    锁升级时单向的,即锁升级后不会降级。

偏向锁:一个线程获取偏向锁时,会在对象头的markword和当前线程的栈帧中的锁记录里存储偏向的线程ID.获取锁的线程,再次进出同步块,无需加锁和释放锁,只需通过CAS验证一下,Markword中的线程ID是否指向自己,如果成功,表示线程已经获取了锁,如果失败,则需要检查下Markwrod中的偏向锁标志位是否为1。如果为1,则CAS尝试把偏向锁指向自己,如果不是,则尝试CAS竞争锁。

偏向锁何时撤销:偏向锁只有在竞争的情况下才会释放锁。当一个获取偏向锁的线程,在退出同步块时,并不会主动的去释放锁,而是需要等到另一个线程来尝试获取偏向锁时,拥有偏向锁的线程才会释放锁。锁的撤销需要等到全局安全点,即没有字节码执行。

偏向锁撤销流程:先暂停拥有偏向锁的线程,检查获取锁的线程是否还活着,如果没有,则把对象头设置为无锁状态。若还活着,则遍历线程的锁记录,栈中的锁记录和对象头的markword要么重新指向别的线程,要么恢复到无锁状态或标记对象不适合作为偏向锁。  最后唤醒暂停的线程。

轻量级锁:当偏向锁出现竞争时,偏向锁会升级成轻量级锁

轻量级锁加锁:尝试获取锁的线程会在当前栈帧中创建一个存放锁记录的内存空间,然后将对象头中的MarkWord信息复制到改空间中,最后用CAS尝试将对象头中的MarkWord修改为指向自己锁记录空间的指针。如果成功则获取锁。如果失败则表示其他线程在竞争锁,当前线程便尝试自旋获取锁。若在自旋时间内还未获取到锁,便将轻量级锁膨胀为重量级锁,然后线程阻塞。注:这里有个疑问,在线程复制对象头中的MarkWord时,应该还有个判断操作,读取到的MarkWord是否为对象头原本的信息。如果没有,那么当一个线程成功获取锁并修改了MarkWord后,这时来了一个线程读取到被修改后的MarkWord,然后CAS成功,不就造成了多个线程同时获取锁了嘛?

轻量级锁的解锁:获取锁的线程在解锁时,通过CAS将锁记录中的markword恢复到对象头中去,如果成功则释放锁,如果失败,则表示有线程在竞争锁,锁升级为重量级锁,释放锁,唤醒等待的线程。注:既然线程都已经获取到锁了,那么其他线程在尝试CAS获取锁时肯定会失败,为何释放锁时的CAS操作也会失败呢?我想这里的失败是因为,其他线程获取锁失败后把锁升级成了重量级锁,对象头中的makrword值改变了,故而解锁的CAS会失败。

处理器如何保证原子性:1.锁总线  2.锁缓存。但是有三种情况不会锁缓存:1.处理器不支持   2.当操作的数据不在缓存中  3.操作的数据横跨了多个缓存行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值