Java并发
文章平均质量分 93
姜_白
这个作者很懒,什么都没留下…
展开
-
并发编程BUG的源头
,在这个例子中,编译器调整了语句的顺序,但是不影响程序的最终结果。早期的操作系统基于进程来调度 CPU,不同进程间是不共享内存空间的,所以进程要做任务切换就要切换内存映射地址,而一个进程创建的所有线程,都是共享一个内存空间的,所以线程做任务切换成本就很低了。对于上面的三条指令来说,我们假设 count=0,如果线程 A 在指令 1 执行完后做线程切换,线程 A 和线程 B 按照下图的序列执行,那么我们会发现两个线程都执行了 count+=1 的操作,但是得到的结果不是我们期望的 2,而是 1。原创 2024-06-04 10:15:37 · 913 阅读 · 0 评论 -
Java并发编程-ArrayList安全问题
文章目录ArrayList安全问题解决方案CopyOnWriteArrayListadd(E e)ArrayList安全问题public class ContainerNotSafeDemo { public static void main(String[] args) { List<String> strings = new ArrayList<...原创 2020-02-25 11:59:47 · 304 阅读 · 0 评论 -
Java并发编程-AtomicInteger-CAS底层原理
AtomicIntegerAtomicInteger是使用CAS来保持原子性。而Unsafe是CAS的核心类,由于Java方法无法直接访问操作系统低层,需要通过本地native方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据Unsafe // setup to use Unsafe.compareAndSwapInt for updates private...原创 2020-02-24 20:30:24 · 176 阅读 · 0 评论 -
Java并发编程-volatile详解
文章目录Volatile简述可见性不保证原子性禁止指令重新排序内存屏障:在内存屏障指令的上下的两个指令是禁止重新排序。Volatile简述volatile只能修饰Java中的属性,可以保证可见性,禁止指令重排序,不保证原子性可见性每一个线程在创建的时候都会从主内存中复制一份数据,到自己的工作内存中。而多个线程同时运行,每个线程都会从主内存的copy一份数据,各自的工作内存互不影响。...原创 2020-02-22 19:02:14 · 126 阅读 · 0 评论