线程资源不可见原因:
1、CPU高速缓存造成极短时间内数据的不可见
2、指令重排导致不可见
不可见测试:
由上图可知,当我们改变eatFlag为true时,并没有输出我们预想的数据(例如:线程中资源正在运行...)
解决办法:
1、线程休眠(sleep)
如上图,线程休眠的时候,抑制了cpu的高速缓存,使得当前线程内的数据可见,但是不建议这样,因为线程休眠会影响用户的体验感
2、使用线程锁(synchronized)
对于上锁的线程,一旦一个代码块或者方法被Synchronized所修饰,那么它执行完毕之后,被锁住的对象所做的任何修改都要在释放之前,从线程内存写回到主内存,另一个线程从主内存得到数据并加载到自己线程的内存中。
3、使用volatile(无定性的)修饰变量
volatile修饰的变量对于外部线程是可见的
总结:
1、线程之间的传参需要保持可见性
2、保持可见性的方法有线程休眠、volatile修饰参数、线程锁等操作。
补充:cpu高速缓存时,不同的线程处于不同的时间片,这些线程相当于不同的程序,所以需要第三者来连接线程,帮助线程传递参数,或者用volatile声明线程里面的资源对所有线程是可见的,因为资源是可见的,所以在多线程下会产生参数线程安全问题
-----------------------------------------------------------分割线-------------------------------------------------------------
注:文章为作者笔记,有问题欢迎评论留言。
@time:2022_11_7