用一个变量控制线程里面的资源问题,线程可见性问题

本文探讨了线程资源不可见的原因,包括CPU高速缓存和指令重排,并提供了解决方案,如线程休眠、使用`synchronized`关键字以及应用`volatile`修饰符确保线程间变量的可见性。总结强调了线程间传参的可见性需求及其维护方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程资源不可见原因:

1、CPU高速缓存造成极短时间内数据的不可见

2、指令重排导致不可见

不可见测试:

 由上图可知,当我们改变eatFlag为true时,并没有输出我们预想的数据(例如:线程中资源正在运行...)

解决办法:

1、线程休眠(sleep)

 如上图,线程休眠的时候,抑制了cpu的高速缓存,使得当前线程内的数据可见,但是不建议这样,因为线程休眠会影响用户的体验感

2、使用线程锁(synchronized)

 对于上锁的线程,一旦一个代码块或者方法被Synchronized所修饰,那么它执行完毕之后,被锁住的对象所做的任何修改都要在释放之前,从线程内存写回到主内存,另一个线程从主内存得到数据并加载到自己线程的内存中。

3、使用volatile(无定性的)修饰变量

 volatile修饰的变量对于外部线程是可见的

总结:

1、线程之间的传参需要保持可见性

2、保持可见性的方法有线程休眠、volatile修饰参数、线程锁等操作。

补充:cpu高速缓存时,不同的线程处于不同的时间片,这些线程相当于不同的程序,所以需要第三者来连接线程,帮助线程传递参数,或者用volatile声明线程里面的资源对所有线程是可见的,因为资源是可见的,所以在多线程下会产生参数线程安全问题

-----------------------------------------------------------分割线-------------------------------------------------------------

注:文章为作者笔记,有问题欢迎评论留言。

@time:2022_11_7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值