前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >线程安全性---面试题--i++的线程安全性问题

线程安全性---面试题--i++的线程安全性问题

作者头像
wust小吴
发布2019-07-08 16:55:18
7090
发布2019-07-08 16:55:18
举报
文章被收录于专栏:风吹杨柳风吹杨柳

这个类真的非常实用,更重要的是 它确实非常简单:

附上自己的代码,可以自己试试:

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

代码:

package test;

import java.util.concurrent.atomic.AtomicInteger; /**  * 来看AtomicInteger提供的接口。

 //获取当前的值  public final int get()  //取当前的值,并设置新的值   public final int getAndSet(int newValue)  //获取当前的值,并自增   public final int getAndIncrement()   //获取当前的值,并自减  public final int getAndDecrement()  //获取当前的值,并加上预期的值  public final int getAndAdd(int delta)

 * @author YangBaoBao  *  */ public class AtomicIntegerDemo {  public static void main(String[] args) {   AtomicInteger ai=new AtomicInteger(0);   int i1=ai.get();   v(i1);   int i2=ai.getAndSet(5);   v(i2);   int i3=ai.get();   v(i3);   int i4=ai.getAndIncrement();   v(i4);   v(ai.get());  }  static void v(int i)  {   System.out.println("i : "+i);  } }

那么为什么不使用记数器自加呢,例如count++这样的,因为这种计数是线程不安全的,高并发访问时统计会有误,而AtomicInteger为什么能够达到多而不乱,处理高并发应付自如呢,我们才看看AtomicInteger的源代码:

Java代码  

  1. private volatile int value;  

大家可以看到有这个变量,value就是你设置的自加起始值。注意看它的访问控制符,是volatile,这个就是保证AtomicInteger线程安全的根源,熟悉并发的同学一定知道在java中处理并发主要有两种方式:

1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到。

2,volatile修饰符的使用,相信这个修饰符大家平时在项目中使用的也不是很多。

这里重点说一下volatile:

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存重新读取该成员的值,而且,当成员变量值发生变化时,强迫将变化的值重新写入共享内存,这样两个不同的线程在访问同一个共享变量的值时,始终看到的是同一个值。

java语言规范指出:为了获取最佳的运行速度,允许线程保留共享变量的副本,当这个线程进入或者离开同步代码块时,才与共享成员变量进行比对,如果有变化再更新共享成员变量。这样当多个线程同时访问一个共享变量时,可能会存在值不同步的现象。

而volatile这个值的作用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。

建议:当多个线程同时访问一个共享变量时,可以使用volatile,而当访问的变量已在synchronized代码块中时,不必使用。

缺点:使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年03月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档