zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    三、在Canvas中使用WebGL
    二、认识Canvas
    一、WebGL概述
    给XXX客户服务器转移过程中的重大失误
    centos运行netcore error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
    centos运行netcore error:package: ‘Microsoft.AspNetCore.Antiforgery‘, version: ‘2.0.3‘
    React.js 三周 -- 入门到搭建团队基础项目
    Javascript百学不厌
    Javascript百学不厌
    Javascript百学不厌
  • 原文地址:https://www.cnblogs.com/iCanhua/p/8546036.html
Copyright © 2011-2022 走看看