关于多个线程访问同一个全局变量的问题

我实在太稳健了 2019-08-10 07:48:23
有一个全局变量:num
问题1:
一个线程去写变量num,一个线程去读变量num;那么,是否安全?是否需要加volatile呢?

问题2:
多个线程同时读写变量num,但他们的写操作都保证了原子性,是不是只要加一个volatile就可以了呢?

问题3:
多个线程同时读写变量num,但写的时候无法保证原子性,比如num++操作这样子,是不是必须使用Synchronized才可以保证同步呢?
那么,加了Synchronized后,是否还需要再加volatile呢?
...全文
1765 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-08-12
  • 打赏
  • 举报
回复
引用 楼主 弈剑书生 的回复:
有一个全局变量:num 问题1: 一个线程去写变量num,一个线程去读变量num;那么,是否安全?是否需要加volatile呢? 问题2: 多个线程同时读写变量num,但他们的写操作都保证了原子性,是不是只要加一个volatile就可以了呢? 问题3: 多个线程同时读写变量num,但写的时候无法保证原子性,比如num++操作这样子,是不是必须使用Synchronized才可以保证同步呢? 那么,加了Synchronized后,是否还需要再加volatile呢?
1需要加。 多线程同时读写本身就不是原子性,你如果保证原子性那必然已经加入了同步,所以2,3都是一个问题。加了同步后volatile已经可有可无了。
心怀啊 2019-08-10
  • 打赏
  • 举报
回复
volatile的功能就一个,就是保证每次读到的数据都是最新的,其他的没有任何保证,记住这句话就行了
立刀流 2019-08-10
  • 打赏
  • 举报
回复
Volatile只保证可见性,不保证原子性。把这个加上,写操作再上锁,ok完事儿
萌虎生威 2022-02-22
  • 举报
回复
@立刀流 是不是加锁也要看数据类型吧,如果是 int float byte char bool,这些读写,本身就是原子操作,不需要加锁,如果是double,long,ulong,decimal 这些是需要加锁的。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧