java并发问题

funfeiba 2016-06-30 08:23:05


这个程序用来实现计数的,我觉得volatile修饰符可以去掉。因为“synchronized ”保证了value具有可见性,所以不需要volatile
...全文
2619 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33838544 2017-01-21
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
写上了锁,没什么好说的。读没有上锁,也是有竞争关系的,因为java变量在工作内存、寄存器上与主内存是有不一致的情况,volatile就保证每次取跟主内存一直。
李秀才 2016-09-04
  • 打赏
  • 举报
回复
引用 2 楼 nyq1999 的回复:
volatile 是给get用得
一语中的。
it_chenfanglin 2016-07-15
  • 打赏
  • 举报
回复
volatile是无法保证 value++线程安全的,不过你加了synchronized,其实就不必要volatile修饰了; 但是在高并发情况下,我建议使用 AtomicInteger value = new AtomicInteger ()
ArayChou 2016-07-14
  • 打赏
  • 举报
回复
cpu有cache cpu有cache cpu有cache cache命中不会去主内存取 编译器有优化,如果以前刚好读取过变量进入寄存器.编译器会认为再读入一次很傻再读入一次很傻再读入一次很傻.有了volatile关键字,编译器不会自作聪明. 另外,有些应用场景,getValue()也可能需要添加synchronized关键字,防止读的过程中值被修改
nyq1999 2016-07-13
  • 打赏
  • 举报
回复
volatile 是给get用得
lecky-fu 2016-07-08
  • 打赏
  • 举报
回复
根据监视器锁规则提供的happen-before规则,synchronized能够保证临界区代码块退出之后对于后续代码具有可见性。 临界区代码块退出之后,才会将临界区内的变量全部刷新回主内存,并不能立即保证变量value的可见性。 而volatile修饰value保证在value变量上的任何修改会立即被其他线程看到。 对于上面的那个例子: 如果临界区内代码执行完value++之后,并没有立即退出临界区,那么value变量的值可能并没有被刷新回主内存,不具备可见性。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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