美文网首页
学习笔记2-多线程的可见性和原子性问题

学习笔记2-多线程的可见性和原子性问题

作者: 在知识的海洋里遨游 | 来源:发表于2020-10-24 12:37 被阅读0次

1.JVM运行时数据区

分为线程共享区域(又分为方法区,堆内存)
线程独占区域(又分为虚拟机栈,本地方法栈,程序计数器)

2.多线程的可见性问题

变量加volatile关键字,代表此字段不需要被优化,不需要被缓存,
造成可见性问题的原因是JIT(JUST IN TIME即时编译器),jvm对程序的优化,对热点代码进行缓存,或者指令的重排序,有可能会影响最终执行结果,使用该关键字告诉底层jvm不需要被优化

3.可以在线程之间共享的内存称为共享内存或堆内存,所有实例字段,静态字段和数组元素都存在堆内存中

4.原子性(atomicInteger.incrementAndGet()多线程安全的i++)

指多线程操作对象过程中,对象不能被其他线程改变
jdk提供了JUC并发包下的Atomic类,底层是使用Unsafe类,Unsafe类中是一些native方法,native方法是非java实现的方法,底层是c++实现,可以直接操作内存,Unsafe的CAS机制,可以保证原子性.CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则返回V
5.jdk8之后LongAdder提供了更高效的i++
原理是将i分成好几个,然后不同线程操作不同的i.,最后再将结果累加,这种分而治之的思维,可以减少线程对同一资源的争抢,提高i++操作效率
6.atomicInteger.incrementAndGet()有什么缺点?
1.线程在争抢资源时,自旋+CAS,会消耗cpu,多个线程争抢资源
2.只能对单一数据实现原子性,无法对多个数据实现原子性
3.ABA问题(可以使用带版本号的原子变量解决)

相关文章

  • 学习笔记2-多线程的可见性和原子性问题

    1.JVM运行时数据区 分为线程共享区域(又分为方法区,堆内存)线程独占区域(又分为虚拟机栈,本地方法栈,程序计数...

  • 并发编程-简单了解

    1.三个问题:原子性问题,可见性问题,有序性问题 原子性:要么全部执行,要么全部不执行 可见性:当多线程访问同一个...

  • 多线程与线程安全

    多线程核心问题 多线程要解决的核心问题包括三个,分别是原子性问题,可见性问题,有序性问题 原子性 即一个操作或者多...

  • volatile#synchronized

    可见性原子性有序性 多线程三原则 volatile(不能修饰局部变量) 并发中存在可见性问题,volatile可以...

  • volatile理解

    volatile主要用来解决线程的可见性,有序型和原子性问题(synchronized和锁也可,volatile更...

  • Java多线程

    01 |可见性、原子性和有序性问题:并发编程Bug的源头 原子性:线程切换导致原子性。 可见性:CPU缓存导致可见...

  • 一男子给对象转账5000元,居然又退还了!

    在并发编程中,所有问题的根源就是可见性、原子性和有序性问题,这篇文章我们就来聊聊原子性问题。 在介绍原子性问题之前...

  • 1.2.2 线程安全之原子性操作

    什么是原子操作 一个或若干个操作看成一个整体,要不全不执行要不全部不执行 可见性问题和原子性问题的区别 可见性问题...

  • volatile如何保证有序性?内存屏障都不知道怎么拿offer

    在多线程的世界里,一共有三个问题:原子性问题、可见性问题、有序性问题。整个java并发体系也是围绕着如何解决这三个...

  • Java并发——volatile、synchronized、lo

    在并发编程中有三个典型问题:原子性问题,可见性问题,有序性问题。 原子性问题 原子性:即一个操作或者多个操作 要么...

网友评论

      本文标题:学习笔记2-多线程的可见性和原子性问题

      本文链接:https://www.haomeiwen.com/subject/gbcvyhtx.html