加了volatile运算的结果还是不对,求解。。

小勤哥 2017-04-22 10:56:04

public class Volatile {

volatile static int i = 0;
static int threadNum = 100;
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[threadNum];
for (int j = 0; j < threadNum; j++){
threads[j] = new Thread(new Runnable() {

@Override
public void run() {
for (int a = 0; a < 100; a++){
i+=1;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
});
threads[j].start();
}
for (int j = 0; j < threadNum; j++){
threads[j].join();
}
System.out.println(i);
}

}


运行结果:

...全文
225 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍茫行者 2017-04-25
  • 打赏
  • 举报
回复
引用 4 楼 u011619071 的回复:
volatile 它不负责数据间的竞争关系,他只能保证变量在线程之间的可见性,建议楼主看一下 java的线程模型。 如果要实现竞争关系,考虑加锁,或者使用CAS。
volatile只保证可见性,但没有原子性,如果是在A线程中设置i=8,在B线程读取i为8,如果是i+=8,起码有临时变量=i + 8 ,i=临时变量。
苍茫行者 2017-04-25
  • 打赏
  • 举报
回复
引用 6 楼 u011619071 的回复:
[quote=引用 5 楼 abcd1594433168 的回复:] [quote=引用 4 楼 u011619071 的回复:] volatile 它不负责数据间的竞争关系,他只能保证变量在线程之间的可见性,建议楼主看一下 java的线程模型。 如果要实现竞争关系,考虑加锁,或者使用CAS。
volatile只保证可见性,但没有原子性,如果是在A线程中设置i=8,在B线程读取i为8,如果是i+=8,起码有临时变量=i + 8 ,i=临时变量。[/quote] 然后你想表达什么。[/quote] 那你就保证它的原子性,加锁或者直接使用AtomicInteger
X元素 2017-04-25
  • 打赏
  • 举报
回复
引用 5 楼 abcd1594433168 的回复:
[quote=引用 4 楼 u011619071 的回复:] volatile 它不负责数据间的竞争关系,他只能保证变量在线程之间的可见性,建议楼主看一下 java的线程模型。 如果要实现竞争关系,考虑加锁,或者使用CAS。
volatile只保证可见性,但没有原子性,如果是在A线程中设置i=8,在B线程读取i为8,如果是i+=8,起码有临时变量=i + 8 ,i=临时变量。[/quote] 然后你想表达什么。
X元素 2017-04-24
  • 打赏
  • 举报
回复
volatile 它不负责数据间的竞争关系,他只能保证变量在线程之间的可见性,建议楼主看一下 java的线程模型。 如果要实现竞争关系,考虑加锁,或者使用CAS。
110成成 2017-04-24
  • 打赏
  • 举报
回复
给你一个帖子,你看下http://www.cnblogs.com/hapjin/p/5492880.html
weixin_38388710 2017-04-23
  • 打赏
  • 举报
回复
如果想要得到10000的话,要使用Java提供的类型
weixin_38388710 2017-04-23
  • 打赏
  • 举报
回复
这结果没问题啊。。。

51,411

社区成员

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

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