关于Java多线程里成员变量的线程安全问题
多个线程访问同一个成员变量,从理论上来说拿到的应该是不同的。
但是我事实貌似不是这样,求解。
我在实际写多线程的程序的时候,发现成员变量被其他线程修改了。
非要用ThreadLocal修饰才可以成为各线程自己的变量么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
多个线程访问同一个成员变量,从理论上来说拿到的应该是不同的。
但是我事实貌似不是这样,求解。
我在实际写多线程的程序的时候,发现成员变量被其他线程修改了。
非要用ThreadLocal修饰才可以成为各线程自己的变量么?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
没看到你的代码不好说。
没看到你的代码不好说。
内存可见性问题,给变量加个
volatile试试
我觉得LZ说的不是大家说的意思,而是假如说类A继承Runnable,然后作为一个线程来跑,成员变量由初始化时传入,线程在跑得过程中,变量似乎被其他线程修改,是这样吗?
这个现象是java内存模型决定的。每个线程有自己私有的工作内存区,其他线程不可见。JVM有一块主内存区,每个线程都能访问。当线程要操作主存中对象的时候,JVM会复制对象到线程的工作内存区,操作完成后再把对象写回去主存。
并发时候,米有办法保证/知道读取到的主存中的对象是原始的还是已经被改过的。所以加ThreadLocal吧。
实例只有一个,访问同一个变量,结果当然是相同的啊
要看你怎么写的了,如果只是本身变量只是在本线程操作,没有暴露给其他线程是不会出这个问题的。
因为你访问的成语变量的类是相同的吧,才导致取到的值相同吧
因为你访问的成语变量的类是相同的吧,才导致取到的值相同吧