深入理解java:2.3. 并发编程 java.util.concurrent包
JUC
java.util.concurrent包,
这个包是从JDK1.5开始引入的,在此之前,这个包独立存在着,它是由Doug Lea开发的,名字叫backport-util-concurrent,
在1.5开始引入java,命名路径为java.util.concurrent,其中的基本实现方式,也有所改变。
(来源于一位大牛的blog: 深入浅出Java Concurreny (http://www.blogjava.net/xylz/archive/2010/06/30/324915.html))
下图表明,java.util.concurrent包主要有,
AtomicI原子化,基于原子操作的循环CAS算法。
Collections容器,ConcurrentLinkedQueue(非阻塞队列---基于原子引用的循环CAS)
Locks锁,基于非阻塞队列的循环CAS + JNI的unsafe.park(false, 0L)阻塞线程
Collections容器的ConcurrentHashMap是,基于ReentrantLock的锁分段技术
Collections容器的阻塞队列是,基于ReentrantLock / Condition的锁等待技术
Executor线程池。

CAS
CAS,compare and swap,比较和替换
(也有人直接理解为compare and set,其实是一样的)。
CAS是一种乐观锁做法,而且整个JUC的实现都是基于CAS机制的。
如果直接用synchronized加锁,这是一种悲观锁做法,所谓悲观锁,就是悲观的认为线程是绝对不安全的,必须保证在swap值之前,没有任何其它线程操作当前值。
synchronized是一种独占锁,性能受限于这种悲观策略。这一点将在后面详述。
而CAS是一种乐观锁机制,所谓乐观锁,就是相信在compare 和swap之间,被其它线程影响的可能性不大,只要compare校验通过,就可以进行swap。
在Java中,compareAndSet的基本代码如下:
1 public final boolean compareAndSet(int expect, int update) {
2 return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
3 }
从代码中看,java的compareAndSet使用使用JNI中的unsafe接口来实现的,
这是因为,现代CPU基本都提供了特殊的指令,能够做到自动更新共享数据的同时,检测其它线程的干扰,也就是说,CPU本身提供了compareAndSet功能。
所以才能提供JNI的CAS接口。
有了JNI的CAS接口,基于该接口的JUC就能获得更高性能。
在 Intel 处理器中,比较并交换通过指令cmpxchg实现。比较是否和给定的数值一致,如果一致则修改,不一致则不修改。
深入理解java:2.3. 并发编程 java.util.concurrent包的更多相关文章
- Java 多线程高并发编程 笔记(一)
本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...
- Java并发编程-Java内存模型
JVM内存结构与Java内存模型经常会混淆在一起,本文将对Java内存模型进行详细说明,并解释Java内存模型在线程通信方面起到的作用. 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存 ...
- 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这 ...
- java线程高并发编程
java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史 ...
- Java中的并发编程集合使用
一.熟悉Java自带的并发编程集合 在java.util.concurrent包里有很多并发编程的常用工具类. package com.ietree.basicskill.mutilthread.co ...
- Java 多线程:并发编程的三大特性
Java 多线程:并发编程的三大特性 作者:Grey 原文地址: 博客园:Java 多线程:并发编程的三大特性 CSDN:Java 多线程:并发编程的三大特性 可见性 所谓线程数据的可见性,指的就是内 ...
- 高并发编程基础(java.util.concurrent包常见类基础)
JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...
- 《java.util.concurrent 包源码阅读》 结束语
<java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码,一边 ...
随机推荐
- @Autowired与@Resource的区别(转载)
原文地址:http://bhdweb.iteye.com/blog/1663907 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. ...
- 聚合函数 Aggregate Function
聚合函数是用来统计每个分组的统计信息,它们要跟 group by 一起使用,用来将每个分组所有数据 聚合 成一条统计数据. 包括 max/min/count/avg/sum 等. -- 按照部门进行分 ...
- 一篇文章了解RPC框架原理
1.RPC框架的概念 RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术.使用RPC可以解耦系统,方便维护,同时 ...
- percona-xtrabackup-8.0.7简单快捷使用
percona-xtrabackup-8.0.7简单快捷使用 # 参考资料: https://blog.csdn.net/vkingnew/article/details/83012316 # 环境: ...
- 那些10w+的公众号都在写什么?
出于好奇,那些10w+的公众号都写了些什么,于是我写了几个脚本爬取了各行业Top的公众号文章,进行了关键词统计. 抓取数据.分析用到了3中语言:Node.js,Java,Python.废话不多说,直接 ...
- Nginx的正则表达式
Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Ра ...
- 源码阅读-Kingfisher
最后更新:2018-01-16 使用教程: 官方的链接 使用 Kingfisher 处理网络图片的读取与缓存 1. 开始使用 桥接 KingFisher, 利用 KingfisherCompatibl ...
- druid监控每个服务数据库连接数和SQL执行效率
1.下载druid 2.将刚刚下载的druid放入tomcat下的lib目录 3.配置要监控的服务启动文件,添加: -Dcom.sun.management.jmxremote.port=4090 - ...
- Mongodb副本集集群搭建
一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...
- android 3.0 ationbar使用总结
1,ationbar的基本讲解 http://www.apkbus.com/forum.php?mod=viewthread&tid=125536 仅仅需要根据需求写出一个menu资源文件 2 ...