Atomic类和CAS】的更多相关文章

说Atomic类之前,先聊一聊volatile. 对volatile的第一印象就是可见性.所谓可见性,就是一个线程对共享变量的修改,别的线程能够感知到. 但是对于原子性,volatile是不能保证的.来看看自增操作的问题: volatile int i; i++; i++ 在多线程环境下,是不能保证最终的结果正确的.比如某个时刻,i=5,线程A读取了i的值,说时迟那时快,就在马上要执行++操作时,线程A突然就被切换走了:然后线程B也读取i的值,进行了++操作.这时i的值是6,即使线程A的工作内存…
    这是一个真实案例,曾经惹出硕大风波,故事的起因却很简单,就是需要实现一个简单的计数器,每次取值然后加1,于是就有了下面这段代码:           private int counter = 0;           public int getCount ( ) {                    return counter++;           }     这个计数器被用于生成一个sessionId,这个sessionID用于和外部计费系统交互,这个sessionId理…
1:为什么会出现Atomic类 在多线程或者并发环境中,我们常常会遇到这种情况 int i=0; i++ 稍有经验的同学都知道这种写法是线程不安全的.为了达到线程安全的目的,我们通常会用synchronized来修饰对应的代码块.现在我们有了新的方法,就是使用J.U.C包下的atomic类. 2:Atomic类的原理是什么呢 一句话来说,atomic类是通过自旋CAS操作volatile变量实现的. CAS是compare and swap的缩写,即比较后(比较内存中的旧值与预期值)交换(将旧值…
最近在读jdk源码,怎么说呢?感觉收获还行,比看框架源码舒服多了,一些以前就感觉很模糊的概念和一些类的用法也清楚了好多,举个很简单的例子,我在读Integer类的时候,发现了原来这个类自带缓存,看看如下代码: package com.wyq.test; public class TestIntegerCache { public static void main(String[] args) { String str1 = new String("127"); String str2…
文章目录 问题背景 Lock 使用Atomic java中的Atomic类 问题背景 在多线程环境中,我们最常遇到的问题就是变量的值进行同步.因为变量需要在多线程中进行共享,所以我们必须需要采用一定的同步机制来进行控制. 通过之前的文章,我们知道可以采用Lock的机制,当然也包括今天我们讲的Atomic类. 下面我们从两种方式来分别介绍. Lock 在之前的文章中,我们也讲了同步的问题,我们再回顾一下. 如果定义了一个计数器如下: public class Counter { int count…
并发编程从零开始(十一)-Atomic类 7 Atomic类 7.1 AtomicInteger和AtomicLong 如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加synchronized关键字. 但有了Concurrent包的Atomic相关的类之后,synchronized关键字可以用AtomicInteger代替,其性能更好,对应的代码变为: AtomicInteger的 getAndIncrement() 方法和 getAndDecrement() 方法都调…
参考资料:https://fangjian0423.github.io/2016/03/16/java-AtomicInteger-analysis/http://www.cnblogs.com/549294286/p/3766717.html 最近面试遇到一道编程题,要求两个线程交替打印[0,100]的数字,其中一个只打印奇数,另一个只打印偶数,并且给出特别明显的提示AtomicInteger,当时我在想简直是送分题啊,但事后回想由于手写又没有记得所有API,很多地方不完美,所以面试官最后让我…
java.util.concurrent包分成了三个部分,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concurrent.lock.内容涵盖了并发集合类.线程池机制.同步互斥机制.线程安全的变量更新工具类.锁等等常用工具. 搜索资源:http://blog.csdn.net/zhgflx/article/details/4485848 AtomicInteger: Java的多线程编程模型5--从AtomicInt…
一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS有三个操作数:内存值V.旧的预期值A.要修改的值B,当且仅当预期值A和内存值V相同时(条件),将内存值修改为B并返回true,否则条件不符合返回false.条件不符合说明该变量已经被其它线程更新了. 当多个线程访问相同的数据时,如果使用锁来进行并发控制,当某一个线程(T1)抢占到锁之后,那么其他线程再尝试…
1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurrent.atomic包和JVM提供的CAS操作. 2.Volatile 1)Volatile变量不具有原子性 Volatile变量具有一种可见性,该特性能保证不同线程甚至处理器核心在对这种类型的变量在读取的时候能读到最新的值.但Volatile变量不提供原子操作的保证. 下面我们给出一个例子: publ…