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

线程资源不可见原因:

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

2、指令重排导致不可见

不可见测试:

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

解决办法:

1、线程休眠(sleep)

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

2、使用线程锁(synchronized)

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

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

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

总结:

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

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

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

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

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

@time:2022_11_7

猜你喜欢

转载自blog.csdn.net/weixin_62222095/article/details/127728666
今日推荐