java 对基本类型的修改是否是线程安全的

_GMC_ 2017-08-11 09:54:46
public class Volatiletest {
public int a;
public volatile boolean flag=false;
public void set(){
a=1;
flag=true;
}
public void get(){
System.out.println(Thread.currentThread().getName()+"before "+a);
if(flag)
System.out.println(Thread.currentThread().getName()+"after"+ a);

}
class Set extends Thread{

@Override
public void run() {
set();
}
}
class Get extends Thread{


@Override
public void run() {
get();
}
}
}


假设这个问题是答案是不安全的(对基本类型的修改对其他线程是不可见的),那么输出结果就是before0,after0
...全文
655 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-08-15
  • 打赏
  • 举报
回复
考虑用 AtomicBoolean、AtomicInteger、AtomicLong 类
6点A君 2017-08-15
  • 打赏
  • 举报
回复
引用 1 楼 abcdefghiijklmnopqrs 的回复:
线程安全的主语是方法
详细点么?没听栋啊
ForestDB 2017-08-14
  • 打赏
  • 举报
回复
对于LZ的原始问题,由于对flag和int的操作未做同步,那么结果有可能是: 1、before0;Get线程跑的时候,Set线程还未执行,或者还未运行到置flag为true; 2、before1, after1;Get线程跑的时候,Set线程已经结束了; 3、before0, after1;Get线程打完一个print,Set线程开始运行,并结束,然后Get线程继续;
ForestDB 2017-08-14
  • 打赏
  • 举报
回复
这里的原子指的是操作的同步。 对于基本类型的读写,自然是能读到或者写入完整的值,不会说一个线程写,一个线程读会读到了赋了一半的值。 不是原子的,指的是操作是不同步的,即如果两个线程同时对它写操作,那么结果是不同步的。 比如int i = 0;两个线程同时做+1的操作,那么结果有可能是2(运气好),但也有可能是1(不同步)。 对于这种两个线程操作同一资源,自然是要自行处理同步的,比如加锁;或者对于int,那么使用atomic_int,也可以达到同步到效果,这里的atomic,就是原子的含义。
_GMC_ 2017-08-14
  • 打赏
  • 举报
回复
引用 2 楼 ForestDB 的回复:
感觉LZ其实想问的是基本类型的修改是否是原子的,答案是:不是的。
对基本类型简单的赋值不是原子的吗?还有一个问题,如果不加锁,不用volatile 修饰,那么该线程的数据什么时候同步到主存,是固定的,还是不可控的
ForestDB 2017-08-14
  • 打赏
  • 举报
回复
http://www.importnew.com/18126.html 没有细看,不过基本上讲得还行;结论就是如果没有volatile修饰的话,该数据什么时候同步到主存,是不可控的。
_GMC_ 2017-08-14
  • 打赏
  • 举报
回复
引用 6 楼 ForestDB 的回复:
对于LZ的原始问题,由于对flag和int的操作未做同步,那么结果有可能是: 1、before0;Get线程跑的时候,Set线程还未执行,或者还未运行到置flag为true; 2、before1, after1;Get线程跑的时候,Set线程已经结束了; 3、before0, after1;Get线程打完一个print,Set线程开始运行,并结束,然后Get线程继续;
例如,int a=1, 对于++操作这种自然不是原子的,但是我直接赋值呢a=2是原子的吗,我的原始问题的意思是可见性,int a并没有用任何修饰,set线程是修改了本线程中a的值,并没有同步到主存,而flag是同步到主存中,那么get线程可能看到的值不就是a=0,flag=true。还有个问题,如果不坐任何同步,那么该线程的数据什么时候同步到主存,是固定的,还是不可控的?
X元素 2017-08-11
  • 打赏
  • 举报
回复
volatile语义只能确保当前变量的内存可见性,而不能保证变量的原子操作。
ForestDB 2017-08-11
  • 打赏
  • 举报
回复
感觉LZ其实想问的是基本类型的修改是否是原子的,答案是:不是的。
  • 打赏
  • 举报
回复
线程安全的主语是方法

62,635

社区成员

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

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