本文主要记录自己对于多线程安全的学习,先来记几个线程安全模型。

  首先最重要的当然是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线程安全】 — 常用数据结构及原理(未完结)的更多相关文章

  1. JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...

  2. (6)Java数据结构-- 转:JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析  http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balab ...

  3. Java线程内存模型-JVM-底层原理

    public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...

  4. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  5. Java线程池的使用以及原理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6543909.html  一:线程池简介 在使用多线程来提高处理器利用率的同时,由于线程的不断创建和销毁所造成的 ...

  6. Java线程池ThreadPoolExecuter:execute()原理

    一.线程池执行任务的流程 如果线程池工作线程数<corePoolSize,创建新线程执行task,并不断轮训t等待队列处理task. 如果线程池工作线程数>=corePoolSize并且等 ...

  7. java线程总结3--synchronized关键字,原理以及相关的锁

    在多线程编程中,synchronized关键字非常常见,当我们需要进行"同步"操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只 ...

  8. java线程总结--synchronized关键字,原理以及相关的锁

    在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定.被synchronized锁定的代码块,只能同时有一条线程访问 ...

  9. JAVA学习总结-常用数据结构

    java中集合框架其实就是数据结构的实现的封装; 参考资料:任小龙教学视频 1,什么是数据结构? 数据结构是计算机存储,组织数据的方式; 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合; ...

随机推荐

  1. Docker Compose安装以及入门

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用. Compose 简介 Compose 项目是 Docker 官方的开源 ...

  2. C#退出程序,退出任务管理器

    //窗体关闭之前 this.FormClosing += (s, r) => { System.Environment.Exit(0); }; //窗体关闭 this.Closed += (s, ...

  3. Oracle 之 树查询 START WITH ... CONNECT BY ...子句

    START WITH ... CONNECT BY ...子句是结构化查询中用到的,其基本语法是: select … from tablename start with 条件1 connect by ...

  4. angular 2 - 005 路由实现机制

    angular2的路由是不是很神奇, url发生了变化却没有看到有任何请求发出? 1. hash模式 url类似 http://localhost:4200/#/task-list,跳转到路由页面再刷 ...

  5. mac ssh 连接超时

    打开终端,进入,/etc/ssh.sudo vi ssh_config 最后一行添加 ServerAliveInterval30 然后保存就可以了

  6. 【Python】解析Python中的条件语句和循环语句

    1.if语句 if语句有好几种格式,比如: if condition: statement 使用 if ... else ...: if condition: statement(1) else: s ...

  7. 【PHP】解析PHP的GD库

    官方文档:http://php.net/manual/en/book.image.php 1.GD库简介 PHP可以创建和操作多种不同格式的图像文件.PHP提供了一些内置的图像信息函数,也可以使用GD ...

  8. 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

  9. linux源码安装服务器所需要的一些依赖库(待完善)

    apaeche :yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel cmake kernel-devel pcre-de ...

  10. 大数据:Parquet文件存储格式

    一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...