多线程
文章平均质量分 93
Java多线程
没头脑遇到不高兴
Java开发
展开
-
借助Nacos配置中心实现一个动态线程池
借助Nacos配置中心实现一个自定义的动态线程池,可以在运行过程中动态调整线程池参数配置,对线程池的运行情况进行监控预警等原创 2023-04-13 19:41:52 · 1943 阅读 · 0 评论 -
Java中的魔法类Unsafe介绍
一、Unsafe类简介Unsafe是位于sun.misc包下的一个类,不属于 Java 标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如 Netty 、Hadoop 、 Kafka 等;Unsafe可认为是Java中留下的后门,提供了一些低层次操作,如直接内存访问、线程的挂起和恢复、CAS 、线程同步、内存屏障。CAS 就是 Unsafe 类中提供的一个原子操作,第一个参数为需要改变的对象,第二个为偏移量 即之前求出来的 headOffset 的原创 2021-01-23 15:12:44 · 802 阅读 · 0 评论 -
Atomic原子操作与ABA问题
一、原子操作原子(atomic )本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在java中可以通过锁和循环CAS(Compare and Swap即比较和交换)的方式来实现原子操作。JVM中的CAS操作正是利用了上文中提到的处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止,具体的类可以参见juc下的atomic包内的原子类。CAS操作属于乐观锁,CAS有3个操作数,内存原创 2021-01-21 13:16:54 · 1643 阅读 · 1 评论 -
Semaphore、CountDownLatch和CyclicBarrier原理及源码分析
前面《JUC并发核心AQS同步队列原理详解》介绍了AQS的同步等待队列的实现原理及源码分析,《ReentrantLock实现原理及源码分析》中介绍了AQS的同步队列独占模式实现的ReentranLock,这节将会介绍一下Semaphore、CountDownLatch和CyclicBarrier,并将会对源码进行分析。一、Semaphore使用及源码分析1、Semaphore的使用介绍Semaphore也就是我们常说的信号量, Semaphore可以控制同时访问的线程个数,通过 acquire原创 2021-01-16 18:37:19 · 640 阅读 · 0 评论 -
ReentrantLock实现原理及源码分析
前面《JUC并发核心AQS同步队列原理详解》介绍了AQS的同步等待队列的实现原理及源码分析,这节我们将介绍一下基于AQS实现的ReentranLock的应用、特性、实现原理及源码分析。一、ReentrantLock简介ReentrantLock位于Java的juc包里面,从JDK1.5开始出现,是基于AQS同步队列的独占模式实现的一种锁。ReentrantLock使用起来比synchronized更加灵活,可以自己控制加锁、解锁的逻辑。ReentrantLock跟synchronized一样也是可重原创 2021-01-16 12:00:43 · 620 阅读 · 0 评论 -
JUC并发核心AQS同步队列原理详解
一、AQS介绍队列同步器AbstractQueuedSynchronizer(简称AQS),AQS定义了一套多线程访问共享资源的同步器框架,是用来构建锁或者其他同步组件的基础框架,是一个依赖状态(state)的同步器。Java并发编程的核心在java.util.concurrent(简称juc)包,而juc包的大部分工具都是以AQS为基础进行构建的,例如Semaphore、ReentranLock、CountDownLatch、CyclicBarrier等,它的作者是鼎鼎大名的Doug Lea。AQ原创 2021-01-09 18:23:33 · 1394 阅读 · 2 评论 -
synchronized(下)锁优化和锁升级过程
一、synchronized锁优化高效并发是从JDK 5升级到JDK 6后一项重要的改进项,HotSpot虚拟机开发团队在这个版本上花费了大量的资源去实现各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightweight Locking)、偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据及解决竞争问题,从而提高程序的执行效率。1、自旋锁与自适应自原创 2021-01-05 13:47:03 · 685 阅读 · 0 评论 -
synchronized(上)使用及底层原理详解
一、线程安全问题1、临界资源多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。 共享:资源可以由多个线程同时访问 可变:资源可以在其生命周期内被修改 2、线程安全问题当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的,否则就是非线程安全原创 2021-01-03 15:01:29 · 353 阅读 · 0 评论 -
原子性、可见性、有序性与happen-before原则
1.原子性(Atomicity)原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个,我们大致可以认为,基本数据类型的访问、读写都是具备原子性的(例外就是long和double的非原子性协定)。如果应用场景需要一个更大范围的原子性保证(经常会遇到),Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机未把lock和unlo原创 2020-12-29 21:28:23 · 821 阅读 · 2 评论 -
volatile内存语义、原理详解、内存屏障
volatile原创 2020-12-25 20:59:45 · 8675 阅读 · 8 评论 -
JMM内存模型介绍
一、JMM的定义1.什么是JMM《Java虚拟机规范》中曾试图定义一种“Java内存模型”(Java Memory Model简称JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM是围绕原子性,有序性、可见性展开。2.主内存与工作内存Java内存模型的主要目的是定义程原创 2020-12-17 13:20:12 · 624 阅读 · 0 评论 -
计算机多级缓存架构和MESI缓存一致性协议
本节将介绍一下计算机的多级缓存(L1、L2、L3)架构、多级缓存与主存怎么进行数据交互的,另外会对MESI(缓存一致性协议)做下介绍,为后面的JMM模型、volatile关键字的学习打下基础。一,现代计算机硬件基本结构1.总线上面图中大部分都比较好理解(如果想详细了解的话可以看下计算机操作系统相关的书籍,了解一下冯诺依曼计算机模型等基础知识。),这里先介绍一下总线:贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递,计算机的各个组件如CPU、内存、磁盘等通过总线进行原创 2020-12-13 17:12:45 · 1059 阅读 · 1 评论 -
Java中的线程基本概念
二、什么是线程现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度CPU的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。线程的实现可以分为两类:1、用户级线程(User-Level Thread)2、内核线线程(Kern原创 2020-12-04 20:59:26 · 737 阅读 · 0 评论