JAVAEE---多线程线程安全

根本原因:随机调度,抢占式执行

多个线程同时修改同一个变量

修改操作不是原子的

内存可见性

指令重排序

上面这段代码可以正常打印出hello,按照我们前面所学,第一次加锁之后,第二次加锁应该有所冲突啊。这里是因为是同一个线程加锁。在synchronized中,第一次加锁会记录线程和计数器为一,下次加锁会判断是否为一个线程。如果不是一个线程则阻塞,是一个线程计数器++。

我们把这个特性叫做可重入

死锁

1.一个线程,一把锁。

这就是我们上面的情况。不过我们用可重入锁来进行了解决

2.两个线程,两把锁

这个给也会成为死锁。我们可以调整加锁顺序来解决。

3.n个线程,m把锁

哲学家就餐问题

我们可以引入加锁顺序来解决

内存可见性

这个代码当我们输入非0的时候,按理说应该结束t1线程但实际并没有。这就是内存可见性问题

因为我们在循环中,不断地执行取fag和判断是否等于0的操作,jvm在优化过程中,进行了误判,后面的读取并不是读内存的fag而是寄存器/缓存中的fag。

解决这个问题我们可以用volatile关键字解决,在变量前加上即可

volatile有俩个功能,保证内存可见性,禁止指令重排序。

相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
前端老石人6 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang6 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab7 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang