关于Java多线程里成员变量的线程安全问题

发布于 2021-11-17 22:12:45 字数 140 浏览 668 评论 9

多个线程访问同一个成员变量,从理论上来说拿到的应该是不同的。

但是我事实貌似不是这样,求解。

我在实际写多线程的程序的时候,发现成员变量被其他线程修改了。

非要用ThreadLocal修饰才可以成为各线程自己的变量么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

月亮是我掰弯的 2021-11-24 08:29:33

没看到你的代码不好说。

谢绝鈎搭 2021-11-24 08:29:09

没看到你的代码不好说。

丢了幸福的猪 2021-11-24 08:28:55

内存可见性问题,给变量加个
volatile试试

巡山小妖精 2021-11-24 08:28:46

我觉得LZ说的不是大家说的意思,而是假如说类A继承Runnable,然后作为一个线程来跑,成员变量由初始化时传入,线程在跑得过程中,变量似乎被其他线程修改,是这样吗?

2021-11-24 07:31:06

这个现象是java内存模型决定的。每个线程有自己私有的工作内存区,其他线程不可见。JVM有一块主内存区,每个线程都能访问。当线程要操作主存中对象的时候,JVM会复制对象到线程的工作内存区,操作完成后再把对象写回去主存。

并发时候,米有办法保证/知道读取到的主存中的对象是原始的还是已经被改过的。所以加ThreadLocal吧。

泛泛之交 2021-11-22 17:53:37

实例只有一个,访问同一个变量,结果当然是相同的啊

爱你是孤单的心事 2021-11-21 15:20:18

要看你怎么写的了,如果只是本身变量只是在本线程操作,没有暴露给其他线程是不会出这个问题的。

晚风撩人 2021-11-19 19:46:45

因为你访问的成语变量的类是相同的吧,才导致取到的值相同吧

离不开的别离 2021-11-19 14:13:12

因为你访问的成语变量的类是相同的吧,才导致取到的值相同吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文