2.java内存模型与线程

一、vlatile关键字的理解

https://www.cnblogs.com/study-everyday/p/8618802.html

对于可见性,Java提供了volatile关键字来保证可见性。

当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存(中间不在穿插其他指令),当有其他线程需要读取时,它会去内存中读取新值。

而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的中间可能穿插其他指令),当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是volatile变量都是如此普通变量与volatile变量的区别是,volatile的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。因此我们可以说volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。

另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

二、对于先行发生的理解

https://www.jianshu.com/p/8c6efbb80e5d

三、AQS源码解析

https://www.cnblogs.com/micrari/p/6937995.html

四、线程池

https://www.jianshu.com/p/9a8c81066201

五、二进制运算

byte:1个字节 8位 -128~127

short :2个字节 16位char:2个字节 16bit

int :4个字节 32位float:4个字节 32bit

long:8个字节 64位double :8个字节 64bit

有符号右移>>: 右移之后, 左边的补上符号位, 正数补0, 负数补1。

无符号右移>>>: 右移之后, 无论该数是正数还是负数, 右移之后左边都是补上0。

https://blog.csdn.net/qq_25406563/article/details/83277660

六、synchornized底层原理: 

 https://blog.csdn.net/github_38838414/article/details/81110128

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容