根据修改的数据类型,可以将JUC包中的原子操作类可以分为4种,分别是: 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray ;3. 引用类型: AtomicReference, AtomicStampedRerence, AtomicMarkableReference ;4. 对象的属性修改类型: AtomicIn…
JUC中的原子类是依靠volatile变量和Unsafe类中的CAS函数实现的. 1. volatile变量的特性 内存可见性(当一个线程修改volatile变量的值后,另一个线程就可以实时看到此变量的更新值,也可以理解为敏感性) 禁止指令重排(位于volatile变量之前的变量执行先于volatile变量执行,volatile之后的变量执行在volatile变量之后) 2. CAS函数保证数据更新的原子性 CAS是Unsafe 类中定义的函数,它只有如下三种形式: public final n…
背景 多线程更新变量的值,可能得不到预期的值,当然增加syncronized关键字可以解决线程并发的问题. 这里提供另外一种解决问题的方案,即位于 java.util.concurrent.atomic包下的原子操作类,提供了一种用法简单,性能高效,线程安全的更新变量的方式. 其它两个附带的类顺带看了一下: LongAddr 多线程先的sum操作 LongAccomulator 多线程下的函数式操作,性能低于AtomicLong,主要是函数式的支持: 简单分类: 基本类型原子类 使用原子的方式更…
1. AtomicLong是基本原子类中的一种 AtomicLong是对长整形进行原子操作. 1.1 AtomicLong类的函数列表 // 构造函数 AtomicLong() // 创建值为initialValue的AtomicLong对象 AtomicLong(long initialValue) // 以原子方式设置当前值为newValue. final void set(long newValue) // 获取当前值 final long get() // 以原子方式将当前值减 1,并返…
前言 为保证计数器中count=+1的原子性,我们在前面使用的都是synchronized互斥锁方案,加锁独占访问的方式未免太过霸道,于是我们来介绍另一种解决原子性问题的无锁方案:原子变量.在正式介绍原子变量之前,我们先来总结下锁的不足,然后深入介绍原子变量. 锁的劣势 通过对共享变量加锁,使得获取到锁的线程可以采用独占方式来访问共享变量,并且对变量的修改对随后获取这个锁的其他线程都是可见的(Happens-Before规则). 当多个线程同时请求锁时,对于没有获取到锁的线程将有可能被挂起并且在…
今天我们来看一下JUC包中的原子类,所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程),原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分.将整个操作视作一个整体是原子性的核心特征. 在atomic包中的这些原子类我们可以大致给他分类为: 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 数组类型:…
在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对象的状态是指存储在状态变量(例如实例或静态域)中的数据. 对象的状态可能包括其他依赖对象的域.比如某个HashMap的状态不仅是HashMap对象本身,还存储在许多Map.Entry对象中. "共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周…
一 前言 前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 .AQS的设计与实现)在前面已经简单介绍过了.今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁 同步锁不是JUC中的锁但也顺便提下,它是由synchronized 关键字进行同步,实现对竞争资源互斥访问的锁. 同步锁的原理:对于每一个对象,有且仅有一个同步锁:不同的线程能共同访问该同步锁.在同一个时间点该同步锁能且只能被一个线程获取到,其他线程都得等待. 另外:synchronized是Java中的关…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种互相等待的现象.若不受外力作用,他们都将无法推进下去.此时,处于系统中所处的状态就是死锁. 2.发生死锁所必须具备的条件: 互斥条件:它是指进程对所分配的资源进行排他性的使用,在一定时间内,某资源只由一个进程在用,如果此时还有其他进程请求资源,请求者只能等待.直到占有资源的进程用完或释放之后才可以继…
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有不论什么线程能够通过,当到达结束状态时.这扇门才会打开并容许全部线程通过.它能够使一个或多个线程等待一组事件发生. 闭锁状态包含一个计数器.初始化为一个正式,正数表示须要等待的事件数量. countDown方法递减计数器.表示一个事件已经发生,而await方法等待计数器到达0.表示等待的事件已经发生. CountDownLatch强调的是一个线程(或多个)须要等待另外的n个线程干完某件事情之后才干继续运行. 场景应用: 10个运…