java多线程访问同一共享变量问题

qq412101450 2017-05-24 09:46:04
直接上代码,为什么会输出error那一段,求大神解答!
public class ThreadTest {

private int flag = 0;

public void set1() {
flag = 0;
}

public void set2() {
flag = -1;
}

public void check() {
System.out.println(flag);
if (0 != flag && -1 != flag) {
System.out.println("error--------flag : " + flag);
}
}

public static void main(String [] args) {
final ThreadTest test = new ThreadTest();

final Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.set1();
}
}
});
thread1.start();

final Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.set2();
}
}
});
thread2.start();

final Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
test.check();
}
}
});
thread3.start();
}
}
...全文
459 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱摸鱼de老邪 2017-05-25
  • 打赏
  • 举报
回复
必然会输出error,多线程访问同一变量不进行同步的话: 判断0!=flag的时候,flag的值是-1,判断-1!=flag的时候,flag的值是0,就会进入error输出了。 这个条件判断不是原子操作,你可以看看编译的字节码
qq412101450 2017-05-25
  • 打赏
  • 举报
回复
谢谢 still_rain , 忽略了判断原子性这个问题
qq412101450 2017-05-24
  • 打赏
  • 举报
回复
上部分结果:

看来是偶发性的。。。

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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