原子类:

ActomicInteger:1.常用方法:getAndSetgetAndAddCompareAndSet(预期值。更新值)incrementAndGet2.用处:提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用。例如:常见的i++是非原子操作,多线程下可能会出现问题,一般而言如果想保证不出问题,需要用sync加锁处理比较麻烦,有了原子类就可以直接用原子类操作。

CAS:

CAS和ABA问题:CAS是什么:compare and swap,CAS是一种无锁算法主要用来解决无锁下的并发问题,主要是预期值跟实际值相等,则将实际值替换成新的值。他主要应用在JUC的并发类中。比如AntomorIntger原子类,常用的increatAndAdd()方法中,底层就是用到了compareAndSet方法,而compareAndSet方法的底层就是compareAndSwap再比如ReentrantLock的lock方法尝试获取锁就是compareAndSwapInt(判断state的值是否为0,如果是则将其设置成1)。ABA问题:CAS使用过程中可能会遇到ABA问题。场景如下:线程A获取到预期值0,线程B获取到预期值0,并将值替换为2,线程B获取到值2,并将值替换为0,线程A将值替换为1。此时线程A虽然替换为1,但是丢失了线程B的修改。比如用户第一次登陆校验余额为0则送10元券,假如碰到ABA问题,B送券之后,用户用掉,此时A再检测就会出问题。解决方法,给预期值以及值增加版本号,即线程B更改过程为①0 ②2 ③0,在A进行比对时,不仅比对0还会比对①CAS的扩展-数据库:CASjava8对CAS的优化:由于采用这种 CAS 机制是没有对方法进行加锁的,所以,所有的线程都可以进入 increment() 这个方法,假如进入这个方法的线程太多,就会出现一个问题:每次有线程要执行第三个步骤的时候,i 的值老是被修改了,所以线程又到回到第一步继续重头再来。而这就会导致一个问题:由于线程太密集了,太多人想要修改 i 的值了,进而大部分人都会修改不成功,白白着在那里循环消耗资源。为了解决这个问题,Java8 引入了一个 cell[] 数组,它的工作机制是这样的:假如有 5 个线程要对 i  进行自增操作,由于 5 个线程的话,不是很多,起冲突的几率较小,那就让他们按照以往正常的那样,采用 CAS 来自增吧。但是,如果有 100 个线程要对 i 进行自增操作的话,这个时候,冲突就会大大增加,系统就会把这些线程分配到不同的 cell 数组元素去,假如 cell[10] 有 10 个元素吧,且元素的初始化值为 0,那么系统就会把 100 个线程分成 10 组,每一组对 cell 数组其中的一个元素做自增操作,这样到最后,cell 数组 10 个元素的值都为 10,系统在把这 10 个元素的值进行汇总,进而得到 100,二这,就等价于 100 个线程对 i 进行了 100 次自增操作。从Java 1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。乐观锁:认为每次线程请求数据都不会对数据进行修改,所以不加锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS(compare and swap)算法实现。1.数据库:版本号,每次操作的时候增加版本号进行测试。举例富民银行的定时任务2.CAS机制悲观锁总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加(悲观)锁。一旦加锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。悲观锁在MySQL、Java有广泛的使用数据库:MySQL的读锁、写锁、行锁等Java的synchronized关键字

1A:

Executor、ExcutorService、Executor都是jdk1.5以后自带的java并发包下的类。其中Executor是接口,主要方法是execute方法,且返回值是void。

 public interface Executor {void execute(Runnable command);
}

ExecutorService继承了Executor接口,主要方法可以带返回值,常用方法如下:

public interface ExecutorService extends Executor {void shutdown();<T> Future<T> submit(Callable<T> task);<T> Future<T> submit(Runnable task, T result);Future<?> submit(Runnable task);
}

ThreadPoolExecutor是Executor与ExecutorService两个接口的实现类,他的构造函数里包含了很多参数。而Executors是java并发包下的工具类,其中的方法封装了常用的四种ThreadPoolExecutor对象。不过阿里巴巴的开发手册明确禁止使用Executors创建线程池。

继承关系
Executor其中一个方法

2Q.

创建一个线程池有几种方法?

2A.

一般而言我们创建一个线程池有如下几种方法:

1.通过new ThreadPoolExecutor(参数)方法来创建

一个不需要返回值的线程池

 Executor executor=new ThreadPoolExecutor(2,5,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10));

一个需要返回值的线程池

ExecutorService executorService=new ThreadPoolExecutor(2,5,60L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10))

2.通过Executors工具类来创建

Executor executor2=Executors.newSingleThreadExecutor();
Executor executor3=Executors.newFixedThreadPool(10);
Executor executor4=Executors.newCachedThreadPool();
Executor executor5=Executors.newScheduledThreadPool(50);

原子自增_多线程系列-(六)原子类与CAS(了解即可)相关推荐

  1. Java多线程系列--“JUC原子类”01之 框架

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...

  2. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...

  3. JUC多线程:Atomic原子类与CAS原理

    一.Atomic 原子类的原理: Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全.而 CAS 算法的具体实现方 ...

  4. Java多线程系列---“JUC原子类”02之 框架

    转自:http://www.cnblogs.com/skywang12345/p/3514589.html 根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: Atomi ...

  5. Java基础-原子类、CAS

    1.什么是原子类 原子类的作用和锁类似,是为了保证并发情况下的线程安全.不过原子类相比锁,有一定优势 粒度更细:他锁的范围更小 效率更高:相比于锁,效率更高,除了高度竞争的情况 2.6类原子类 Ato ...

  6. Java原子类中CAS的底层实现,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  7. Java多线程系列(六):深入详解Synchronized同步锁的底层实现

    谈到多线程就不得不谈到Synchronized,很多同学只会使用,缺不是很明白整个Synchronized的底层实现原理,这也是面试经常被问到的环节,比如: synchronized的底层实现原理 s ...

  8. java 原子类能做什么_死磕 java原子类之终结篇(面试题)

    概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...

  9. java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

    CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题(1)CAS是什么? 比较并交换 举例1,  CAS产生场景代码? importjava.util.concurrent ...

最新文章

  1. js如何实现扫描身份证识别_人脸识别是如何实现的
  2. 北理工2017年爬虫目录
  3. 【Python】Flask框架系列(三):session和cookie操作、get/post请求、钩子函数
  4. 【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题---WebApi环境搭建运行发布部署篇...
  5. [wikioi]奇怪的梦境
  6. [转]Android应用签名
  7. java.util.vector中的vector的详细用法
  8. 自由职业者的八大挑战
  9. java下载不了_教大家电脑java安装不了怎么办
  10. Siebel 数学运算
  11. 编程语言【JAVA】编程(4)---摇色子
  12. js汉字排序(按照拼音)
  13. c++基础题:判断奇偶数
  14. jmeter 后置处理器
  15. Python 增强视频画质,就这么做!
  16. duration缩写_关于光端机专业名词的中英文及缩写??
  17. c语言学习之转义字符
  18. CMake教程之构建Qt平台
  19. java继承a mya new c,JAVA注解
  20. 杜克大学计算机数据科学,杜克大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第51-100位(QS世界排名)...

热门文章

  1. (三)pscc学习笔记
  2. AD画封装的血泪教训:有叉的放在外侧
  3. 软件测试:homework2
  4. 【Java】【编译】javac编译源代码时,若源文件使用了别的java源代码的函数,javac会自动关联。...
  5. Time complexity analysis of algorithms
  6. 从本地或网页加载图片
  7. [转载] JavaScrip ajaxt和python flask通过json传递数据的方法
  8. [转载] Python str方法
  9. [转载] application/json 四种常见的 POST 提交数据方式
  10. 得先好好研究一数据库