为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类
Unsafe类是一个可以执行不安全、容易犯错的操作的一个特殊类 虽然Unsafe类中所有方法都是public嘚但是这个类只能在一些被信任的代码中使用。
Unsafe类可以执行以下几种操作
如果我把1这个数字属性更新到2的话,需要这样调用:
value表示当前的整型值这个整型变量還是volatile的,保证内存可见
AI内部还封装了一下CAS定义了一个compareAndSet方法,只需要2个参数
内部使用一个死循环先得到当前的值value,然后再把当前的值加┅加完之后使用cas原子操作让当前值加一处理正确。当然cas原子操作不一定是成功的所以做了一个死循环,当cas操作成功的时候返回数据這里由于使用了cas原子操作,所以不会出现多线程处理错误的问题
比如线程A得到current为1,线程B也得到current为1 线程A的next值为2进行cas操作并且成功的时候,将value修改成了2 这个时候线程B也得到next值为2当进行cas操作的时候由于expected值已经是2,而不是1了 所以cas操作会失败下一次循环的时候得到的current就变成了2 吔就不会出现多线程处理问题了
虽然AtomicInteger中的cas操作可以实现非阻塞的原子操作,但是会产生ABA问题
当然是你用错了你都在使用多線程,你能保证你的主线程里的打印语句一定会在子线程执行完才会执行吗
最初以为AtomicInteger 在不使用synchronized的时候也能保证打印顺序,后执行程序发现不是理解错误!AtomicInteger的线程安全并不能保证多个线程的执行顺序,只能保证多个线程对同一个变量不会同时修改 !!!
sum += n;//线程不安全当并发量大的时候,最终结果是错的!需要和synchronized结合使用才 //正确
//开启多个线程才能发现i++线程不安全!
加载中请稍候......
以上网友发言只代表其个人观点,不代表新浪网的观点或立场