【Java线程安全】 — 常用数据结构及原理(未完结)
本文主要记录自己对于多线程安全的学习,先来记几个线程安全模型。
首先最重要的当然是volatile和AQS了;
我们知道,整个java.cuncurrent包的核心就是volatile,CAS加自旋悲观锁;本文作为拓展所用不会详细介绍这些的特性,反之我已经滚瓜烂熟了;
2018.5.10 今日想更新的就是volatile关键字,每次我都第一想到内存可见性,缓存一致性协议,不保证原子性,但缺漏了happen-before和指令重排序,今天主要说明什么是happen-before原则,一句话描述:保证volatile变量之前的所有变量的写操作都happen-before于该变量之后的操作,对之后的所有写具有可见性;注意,这里是之前的变量具有可见性,不是volatile变量,我们都知道volatile变量是具有可见性的;
可见性虽然不是原子性,但是也极为有用,特别是对于读某个变量用于流程控制的,这类情况不用volatile就容易死锁;比喻一个isHappen的boolean变量,由线程1去随机赋值,而由线程二去作循环判断该值是否跳出循环,这个时候volatile就能及时的进行线程间的通讯了,不然两个线程各自维护自身的缓存,就很久才能通讯一次;当然jvm还是尽快保持刷新到内存的;但至少没保障。
AtomicInteger
AtomicInteger,以原子的方式更新Integer值,还记得Volitile关键字吗?不是原子性,仅保证可见性,利用这个关键字和CAS就可以实现比较搞笑的并发线程安全了。以下代码来自Java9,其中第二个方法第属于Unsafe类,该类表示是对整个JVM不安全的操作,所以一般只有JDK代码会用到,我们用户代码会抛出 SecurityException
private volatile int value;
public final int getAndIncrement() {
return U.getAndAddInt(this, VALUE, 1);
}
// platforms not supporting native instructions /**
* Atomically adds the given value to the current value of a field
* or array element within the given object {@code o}
* at the given {@code offset}.
*
* @param o object/array to update the field/element in
* @param offset field/element offset
* @param delta the value to add
* @return the previous value
* @since 1.8
*/
@HotSpotIntrinsicCandidate
public final int getAndAddInt(Object o, long offset, int delta) {
int v;
do {
v = getIntVolatile(o, offset);
} while (!weakCompareAndSetInt(o, offset, v, v + delta));
return v;
}
从这个类可以大概联想到AtomicBoolean、AtomicLong、AtomicReference
PriorityBlockingQueue
作用:一个永远返回优先级最高的元素的队列
堆排序:了解这个类建议先复习数据结构—大顶堆和小顶堆;这里利用了堆排序;
阻塞:优先级阻塞队列,保证了队列的特性,先进先出,但也有不阻塞的API,如poll()不阻塞,但take()阻塞。使用的时候特别注意;
后面持续更新ArrayBlockingQueue、LinkBlockingQueue、ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList、AbstractQueuedSynchronizer、CountDownlatch、CycliBarrier、Semaphore
【Java线程安全】 — 常用数据结构及原理(未完结)的更多相关文章
- JAVA常用数据结构及原理分析
JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...
- (6)Java数据结构-- 转:JAVA常用数据结构及原理分析
JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...
- Java线程内存模型-JVM-底层原理
public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...
- Java线程安全队列Queue实现原理
原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...
- Java线程池的使用以及原理
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6543909.html 一:线程池简介 在使用多线程来提高处理器利用率的同时,由于线程的不断创建和销毁所造成的 ...
- Java线程池ThreadPoolExecuter:execute()原理
一.线程池执行任务的流程 如果线程池工作线程数<corePoolSize,创建新线程执行task,并不断轮训t等待队列处理task. 如果线程池工作线程数>=corePoolSize并且等 ...
- java线程总结3--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行"同步"操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只 ...
- java线程总结--synchronized关键字,原理以及相关的锁
在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...
- JAVA学习总结-常用数据结构
java中集合框架其实就是数据结构的实现的封装; 参考资料:任小龙教学视频 1,什么是数据结构? 数据结构是计算机存储,组织数据的方式; 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合; ...
随机推荐
- SpringCloud无废话入门02:Ribbon负载均衡
1.白话负载均衡 在上一篇的介绍中,我们创建了两个一模一样的服务提供者:Provider1和Provider2,然后它们提供的服务也一模一样,都叫Hello-Service.为什么一样的服务我们要部署 ...
- 通过Pdf预览Excel或者word或者Powerpoint (C#将Office转换为PDF)
下面代码是Excel转换为PDF using System; using System.Collections.Generic; using System.Linq; using System.Web ...
- netty中的ChannelHandler和ChannelPipeline
netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...
- Python 和 Scikit-Learn
Reference:http://mp.weixin.qq.com/s?src=3×tamp=1474985436&ver=1&signature=at24GKibw ...
- android:第十章,后台的默默劳动者——服务,学习笔记
一.多线程 1)本章首先介绍了安卓的多线程编程,说明在子线程中如果要修改UI,必须通过Handler, Message, MessageQueue, Looper来实现,但是这样毕竟太麻烦了. 2) ...
- php urlencode vs java URLEncoder.encode
结论:urlencode 先比URLEncoder.encode多编码 “ * ” 符号,其他都保持一致 php urlencode phpversion()>=5.3 will compli ...
- 洛谷 P1162 填涂颜色
题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要 ...
- Mybatis抛出:Cannot obtain primary key information from the database, generated objects may be incomplete
使用 mybatis generator 生成pojo.dao.mapper时,可能会遇到 Cannot obtain primary key information from the databas ...
- 同一个tomcat下面放多个项目 每个项目用不同的域名访问
vim ./conf/server.conf <Host name=" appBase="/www/test1/webapps" ##这是war包存放的位置 unp ...
- python时间模块time详解
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...