
多线程
you&ok
这个作者很懒,什么都没留下…
展开
-
java原子变量 java.util.concurrent.atomic
AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean;基于CAS原语实现 ,比较并交换、加载链接/条件存储,最坏的情况下是旋转锁支持并发的第一个处理器提供原子的测试并设置操作,通常在单位上运行这项操作。现在的处理器(包括 Intel 和 Sparc 处理器)使用的最通用的方法是实现名为 比较并转换或 CAS 的原语。(在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。PowerPC 处理器有一对名为“加载并保留”和“条原创 2020-09-11 09:53:23 · 267 阅读 · 0 评论 -
代码会重排序 as-if-serial规则和happens-before规则
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。as-if-serial规则和happens-before规则的区别 as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结原创 2020-09-10 14:49:26 · 326 阅读 · 0 评论 -
多线程锁的升级原理
在使用 synchronized 来同步代码块的时候,经编译后,会在代码块的起始位置插入 monitorenter指令,在结束或异常处插入 monitorexit指令。当执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁。而 synchronized 用的锁是存放在 Java对象头 中的。所以引出了两个关键词:“Java 对象头” 和 “Monitor”。1、Java 对象头我们以 Hotspot 虚拟机为例,Hotspot 的对象头原创 2020-09-09 20:22:28 · 1256 阅读 · 0 评论 -
Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解
Java中的并发工具CountDownLatch、CyclicBarrier、Semapphore使用详解在JDK的并发包里面提供了几个非常有用的并发工具,CountDownLatch、CyclicBarrier、Semaphore工具类提供了一种并发控制流程的手段。一、CountDownLatchCountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它运行一个或者多个线程一直处于等待状态。 CountDownLatch中有两个关键的方法public voi转载 2020-09-09 19:42:49 · 160 阅读 · 0 评论 -
ThreadLocal
Threadlocal底层是通过threadlocalMap进行存储键值 每个ThreadLocal类创建一个Map,然后用线程的ID作为Map的key,实例对象作为Map的value,这样就能达到各个线程的值隔离的效果。 ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。 谁设置谁负责移除。总结一下,个人认为使用ThreadLocal的场景最好满足两个条件: 一是该对象不需要在多线程之间共享;原创 2020-09-09 18:23:09 · 223 阅读 · 0 评论 -
java关键字synchronized
Synchronized的基本使用Synchronized 原理 如果对上面的执行结果还有疑问,也先不用急,我们先来了解Synchronized的原理,再回头上面的问题就一目了然了。我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:package com.paddx.test.concurrent;public class SynchronizedDemo { public void method() { synchroniz...原创 2020-09-03 17:19:35 · 157 阅读 · 0 评论 -
锁无关数据结构 -- AtomicReference
基于jdk提供的原子类原语实现,例如AtomicReference锁无关(Lock free)算法,顾名思义,即不牵涉锁的使用。这类算法可以在不使用锁的情况下同步各个线程。对比基于锁的多线程设计,锁无关算法有以下优势: 对死锁、优先级倒置等问题免疫:它属于非阻塞性同步,因为它不使用锁来协调各个线程,所以对死锁、优先级倒置等由锁引起的问题免疫;原语 Compare-and-swap (CAS) ,Herlihy 证明了 CAS 是实现锁无关数据结构的通用原语, CAS 可以原子地比较一个内存位置的内容原创 2020-09-03 16:57:52 · 214 阅读 · 0 评论 -
自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁等
各种锁1、自旋锁 自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行。若线程依然不能获得锁,才会被挂起。 使用自旋锁后,线程被挂起的几率相对减少,线程执行的连贯性相对加强。因此,对于那些锁竞争不是很激烈,锁占用时间很短的并发线程,具有一定的积极意义,但对于锁竞争激烈,单线程锁占用很长时间的并发程序,自旋锁在自旋等待后,往往毅然无法获得对应的锁,不仅仅白白浪费了CPU时间,最终还是免不了被挂起的操作原创 2020-09-03 16:22:37 · 447 阅读 · 1 评论