JUC
崔西儿
这个作者很懒,什么都没留下…
展开
-
AtomicInteger原子变量与CAS算法
-------->CAS原理i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”从变量i中读取读取i的值->值+1 ->将+1后的值写回i中程序:开启10个线程,打印 serialNumber结果:在多次执行情况下,可能出现尽管serialNumber加上了valotile,因为volatile无法保证原子性,所以程序(...原创 2019-08-08 08:24:43 · 146 阅读 · 0 评论 -
模拟CAS算法 (打印看结果)
程序:十个线程去设置值结果:有的成功有的失败举例:①int expectedValue = compareAndSwap.get();②boolean b = compareAndSwap.compareAndSet(expectedValue, (int) (Math.random() * 100));A线程执行 ①获取到了 0,然后B线程获...原创 2019-08-09 08:42:44 · 323 阅读 · 0 评论 -
volatile 可见性
volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。 相较于 synchronized 是一种较为轻量级的同步策略。volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效。程序:ThreadDemo线程更改flag为true,在ma...原创 2019-08-07 08:25:11 · 214 阅读 · 0 评论 -
volatile 可见性代码验证
volatile保证可见性,什么是可见性?程序:让A线程修改number变量,在main线程用while一直循环,直到A线程修改,然后打印 “main线程结束” 结束程序。public class VolatileTest { public static void main(String[] args) { MyTest myTest = new ...原创 2019-08-11 17:43:03 · 302 阅读 · 1 评论 -
volatile不保证原子性代码验证
什么叫原子性?保证数据的完整,一致性,不可分割。一个线程的操作中间不能被分隔,不能被其他线程覆盖。i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写”从变量i中读取读取i的值->值+1 ->将+1后的值写回i中程序:有20个线程,每个线程执行1000次number++public class VolatileTest { pu...原创 2019-08-11 18:15:57 · 212 阅读 · 0 评论 -
volatile禁止指令重排理解和例子说明
计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分一下3种:源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行的指令单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致。(单线程没有影响) 处理器在进行重排序时必须考虑指令之间的数据依赖性。(int a=1; int b=0; 没有依赖,...原创 2019-08-17 06:35:00 · 2122 阅读 · 4 评论 -
CAS原理(源码例子解析)
通过Unsafe保证原子性Unsafe 是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,基于该类可以直接操作特定内存的数据。(注意Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应任务) 变量valueOffset,表示该变量在内存中的偏移地址,因为Unsafe就是根据内存偏...原创 2019-08-17 06:54:36 · 255 阅读 · 0 评论 -
CAS的ABA问题以及解决方法(AtomicStampedReference)
CAS会导致“ABA问题”。如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的"ABA"问题。尽管线程one的CAS操作成功,但是不代表这个过程就是没问题的。程序:线程A,...原创 2019-08-17 15:09:53 · 230 阅读 · 0 评论