
Java并发编程入门与高并发面试实战系列
秋夫人
将军赶路不追野兔
展开
-
AQS 源码解析 - 结合ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier,Semaphor
JDK1.5以前只有synchronized同步锁,并且效率非常低,因此大神Doug Lea自己写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能非常高,所以被引入JDK包中,即JUC。那么AQS是怎么实现的呢?本篇就是对AQS及其相关组件进行分析,了解其原理,并领略大神的优美而又精简的代码。AbstractQueuedSynchronizerAQS是JUC下最核心的类,没有之一,所以我们先来分析一下这个类的数据结构。AbstractQ原创 2020-11-11 21:34:56 · 475 阅读 · 0 评论 -
Java 原子性CAS 原理 ,atomic包 详解
java.util.concurrent.atomic包类的原理atomic包底层原理都是Unsafe.compareAndSwapXXX()方法,也就是通常说的CAS,compareAndSwapXXX方法是native标识的方法,是Java底层代码,不是Java代码实现的,public final class Unsafe { //object public final native boolean compareAndSwapObject(Object obj, long offset,原创 2020-12-15 14:42:30 · 573 阅读 · 0 评论 -
J.U.C之AQS之 CountDownLatch、Semaphore、CyclicBarrier
J.U.C之AQS - 介绍J.U.C(java.util.concurrent)在jdk1.5引入,引入J.U.C大大提高了java的并发性能,AQS(AbstractQueuedSynchronizer的缩写) 可以认为是J.U.C的核心,AQS 可以说是并发类中的重中之重,AQS 提供了基于firstIn,firstOut队列,这个队列可以用来构建锁或者其他相关的同步装置的基础框架 A...原创 2019-01-16 19:17:11 · 386 阅读 · 0 评论 -
并发容器及安全共享策略总结
并发容器及安全共享策略总结J.U.C指的java.util.concurrent包并发容器 - CopyOnWriteArrayListCopyOnWriteArrayList 相比ArrayList 是线程安全的,根据名称知道:写操作时复制;写操作时拷贝一份,在新的数组上进行写操作,操作完之后,再将原来的数组指向新的数组。(CopyOnWriteArrayList整个add操作都是在...原创 2019-01-16 11:59:55 · 365 阅读 · 0 评论 -
同步容器
线程安全 - 同步容器同步容器 - VectorVector 不是线程安全的执行结果:报错,原因:当一个线程remove(i)时,同时另一个线程get(j), i=j,此时就回报错Vector 遍历同步容器或者普通容器中,test1(),test2(),方法都会抛异常,因为在遍历时进行了移除操作,如果要移除Vector元素,可以先做标识,遍历完之后再进行移除,也推荐直接用fo...原创 2019-01-16 09:28:48 · 237 阅读 · 0 评论 -
线程不安全类与写法
线程不安全类什么是线程不安全的类:如果一个类的对象可以同时被多个对象访问,如果不做特殊的同步或者并发的处理,就会很容易表现出线程不安全的现象,比如抛出异常,逻辑处理错误等等StringBuilder执行结果:499049984993线程不安全的StringBuffer执行结果:500050005000线程安全的SimpleDateFormat执行结果:不是线...原创 2019-01-15 18:44:10 · 383 阅读 · 0 评论 -
线程封闭 - threadLocal简单用法
线程封闭把对象封装到一个线程里,只有这一个线程能看到这个对象。所以即使这个对象不是线程安全的,也不会出现线程安全的问题了。创建类RequestHolder,定义一个静态成员变量ThreadLocal requestHolder = new ThreadLocal<>();并定义三个方法,add(),getId(),remove(),分别表示想requestHolder 中添...原创 2019-01-15 15:29:47 · 386 阅读 · 0 评论 -
不可变对象 final、 Collections.unmodifiable、guava的 Immutable**
可以采用的方式包括:1、将类声明为final,这样就不能继承了2、将所有成员声明为私有的,这样就不允许直接访问这些成员3、对变量不提供set方法,将所有可变成员声明为final,这样只能赋值一次4、通过构造器初始化所有成员,进行深度拷贝,在get方法中不返回对象本身,而是返回克隆对象,即对象的深度拷贝finalfinal类不能被继承,参考Stringfinal基本数据类型变量赋值...原创 2019-01-14 21:02:32 · 487 阅读 · 0 评论 -
安全发布对象 - 四种方法 单例模式
执行结果:执行结果:原创 2019-01-14 20:06:06 · 1173 阅读 · 0 评论 -
安全发布对象 - 发布与逸出
安全发布对象 - 发布与逸出发布对象:使一个对象能够被当前范围之外的代码所使用对象溢出:一种错误的发布,当一个对象还没有构造完成时,就使他被其他线程所见发布对象这段代码通过public getStates()访问级别发布了类的域states,在类的任何外部线程都可以访问这个域,这样的发布对象是不安全的,因为我们无法保证其他线程是否回对这个域进行修改。从而造成类里面的域的状态错误。(不推...原创 2019-01-14 14:49:07 · 244 阅读 · 1 评论 -
线程安全性 - 有序性及总结
线程安全性 - 有序性有序性 - happens-before原则(先行发生原则)Java内存模型具有先天的有序性,不通过任何手段,就能得到保证的有序性,称为happens-before原则。如果两个操作的执行顺序无法从本原则推测出来,虚拟机将可随意地对其进行重排序。Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的...原创 2019-01-14 13:48:25 · 2473 阅读 · 0 评论 -
线程安全性 - 可见性volatile
线程安全性 - 可见性可见性 - synchronize可见性 - volatilevolatile可见性的实现:通过内存屏障和禁止重排序优化来实现;1.volatile变量写操作时,会插入一条store屏障指令(StoreStore和storeLoad),将本地内存中的共享变量值刷新到主内存; (store,load是jmm 指令,参考:https://blog.youkuaiyun.com...原创 2019-01-14 09:51:31 · 306 阅读 · 0 评论 -
java内存模型JMM
java内存模型jmm(java memory model)规范,他规范了java虚拟机与计算机内存如何协调工作 ,他规定了一个线程如何及何时看到其他线程修改过的变量的值,以及在必须时,如何同步的访问共享变量。jmm内存分配的概念:堆heap: 优点:运行时数据区,动态分配内存大小,有gc;,缺点:因为要在运行时动态分配,所以存取速度慢,对象存储在堆上,静态类型的变量跟着类的定义一起存储在...原创 2019-01-14 09:21:16 · 23630 阅读 · 4 评论 -
J.U.C-FutureTask
Callable 与Runnable 接口对比Runnable 是个接口,只有一个方法run(),实现Runnable的run(),把要实现的逻辑写到run()中,然后启动线程就行;Callable 代码也很简单,不同的是,Callable 是个泛型接口,call(),返回类型是传入的泛型,Callable 与Runnable大致相似,Callable 功能更强大写,主要是Callable...原创 2019-01-18 12:18:53 · 250 阅读 · 0 评论 -
线程安全性 - 原子性 - 锁 synchronize
原子性 - 锁原子性:互斥性。能保证同一时刻只有一个线程操作的,除了atomic包内的类,另个锁。锁:synchronized, 锁关键字,依赖jvm实现,这个关键字作用对象的作用范围内,同一时刻只能有一个线程操作的,Lock:依赖特殊的cpu指令,代码实现,ReentrantLocksynchronizedsynchronized同步锁,修饰4中对象(1)修饰一个代码块,被修饰...原创 2019-01-12 15:44:44 · 707 阅读 · 0 评论 -
J.U.C之AQS之 ReentrantLock与synchronize区别、ReentrantReadWriteLock、StampedLock
J.U.C之AQS之ReentrantLock与锁ReentrantLock(可重入锁) 与synchronize 区别(1)、可重入性ReentrantLock与synchronize 都具有可重入性,就是同一个线程已经获得了锁,可以再多次获取当前锁,解锁次数要与加锁次数相同,才能释放锁。(2)、锁的实现ReentrantLock 是通过JDK 实现的,synchronize 是JV...原创 2019-01-17 18:39:13 · 603 阅读 · 0 评论 -
并发模拟代码 - CountDownLath、Semaphore
CountDownLatch当前计数器的值为3;线程a 调用了await()方法后,当前线程进入等待状态awaiting;其他线程每次执行countDown()方法时,计数器就会减一,比如:线程1调用countDown()方法,计数器值为2,然后不停的执行,只到计数器为0时,线程a 才继续执行。如图:我们可以看出CountDownLatch是java自带计数器,这个类可以阻塞线...原创 2019-01-11 11:48:22 · 336 阅读 · 0 评论