![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA并发编程
文章平均质量分 55
从硬件底层一步一步往上分析并发编程
Space丶Miao
这个作者很懒,什么都没留下…
展开
-
四种线程池
#### newCachedThreadPool1. 创建一个可缓存的线程池2. 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。3. 如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果又提交了新的任务,则线程池重新创建一个工作线程。4. 适用:执行很多短期异步的小任务#### newFixedThreadPool1. 创建一个指定工作线程数量的线程池2. 每当提交一个任原创 2021-06-09 11:02:55 · 108 阅读 · 0 评论 -
并发编程 — 6.5 JUC — 同步器
同步器名称 作用 CountDownLatch 倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现了AQS框架 CyclicBarrier 循环栅栏,构造时设定等待线程数,当所有线程都到达栅栏后,栅栏放行,然后再进行新的一次循环。其内部通过ReentrantLock和Condition实现同步 Semaphore 信号量,类似于“令牌...原创 2019-12-20 20:09:25 · 130 阅读 · 0 评论 -
并发编程 — 6.4 JUC — 可重入锁
ReentrantLockReentrantLock实现了Lock接口,而ReentrantLock其实相当于一副空壳,它的主要功能就是控制构造出公平锁还是非公平锁,对锁的相关操作细节都是由内部类Sync来完成。Sync继承自AQS(AbstractQueuedSynchronizer),并再衍生出两个内部类非公平锁NofairSync和公平锁FairSync。通过ReentrantLock...原创 2019-12-20 20:06:52 · 132 阅读 · 0 评论 -
并发编程 — 6.3 JUC — 阻塞同步机制AQS
AbstractQueuedSynchronizer(AQS),即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),它是JUC并发包中的核心基础组件。AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态。Node节点AQS维护了一个静态内部类Node,它包含了以下属...原创 2019-12-20 20:02:21 · 471 阅读 · 0 评论 -
并发编程 — 6.2 JUC — 锁 Locks
锁是用于控制多线程访问共享资源的工具。通常,锁提供对共享资源的独占访问:一次只有一个线程可以获取锁,对共享资源的所有访问都需要首先获取锁。但是,一些锁可以允许同时访问共享资源,例如读写锁ReadWriteLock。锁的分类a.悲观锁与乐观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每...原创 2019-12-20 19:56:47 · 123 阅读 · 0 评论 -
并发编程 — 6.1 JUC — 非阻塞同步机制CAS
CAS的作用在多线程并发下,可以通过加锁来保证线程安全性,但多个线程同时请求锁,而线程的挂起和恢复会有很大的开销。一些细粒度的操作,例如同步容器,操作往往只有很少代码量,如果存在锁并且线程激烈地竞争,调度的代价很大。在硬件的支持下,出现了非阻塞的同步机制,其中一种常用实现就是CAS。CAS说明CAS(compare and swap,比较并交换)操作包含三个操作数 —— 内存位置(V)...原创 2019-12-20 19:55:04 · 113 阅读 · 0 评论 -
并发编程 — 5. Unsafe类
Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。可以通过类似 C语言里面的 memcpy 和 memset等函数直接操作对应内存地址的数据。 Unsafe是单例模式,通过调用getUnsafe方法来获取Unsafe实例。但是在方法中通过判断ClassLoader是不是启动类BootStrap ClassLoader来决定是否返回,...原创 2019-12-20 19:51:37 · 259 阅读 · 0 评论 -
并发编程 — 4. 线程Thread
线程状态java中线程的状态分为6种:初始化(New):当线程完成对象创建后,即new Thread(...),还没有调用start()方法之前,线程处于此状态。 运行态(Runnable):调用start方法,正在jvm中运行,但是可能正在等待操作系统的其他资源。(包含了操作系统的可运行和运行中状态) 阻塞(Blocked):受阻塞,并且正在等待监视器锁。 等待(Waiting):...原创 2019-12-20 19:48:20 · 141 阅读 · 0 评论 -
并发编程 — 3. synchronized关键字
synchronized的出现打破了volatile关键字的局限性(无法保证原子性和只能修饰单一变量),它可以用来锁住代码块、实例对象、类对象。synchronized的使用a. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码块前要获得给定对象的锁//Thread类public class MyThread implements Runnable{ private ...原创 2019-12-20 19:45:15 · 95 阅读 · 0 评论 -
并发编程 — 2. volatile关键字
一个变量被volatile修饰时,它会保证需要写回的值会被立即更新到内存,而读取时也会直接从内存读取新值。 volatile关键字保证了可见性和一定的有序性,而不保证原子性。保证可见性//线程1boolean stop = false;while(!stop){ doSomething();}//线程2stop = true;这段代码通过线...原创 2019-12-20 19:37:05 · 102 阅读 · 0 评论 -
并发编程 — 1. 三大概念
原子性一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。类似于数据库的事务的原子性,比如在银行转账时,两个账户进行读写操作,若不具有原子性则可能导致意想不到的结果。再举个例子,一个简单的赋值语句 i=9,假若执行到这句话包括两个过程为低16为赋值和为高16为赋值。那么有可能发生一个线程修改完低16位,被中断。另外一个线程又去读取i的值,这时候就会读取到错误...原创 2019-12-20 19:27:53 · 188 阅读 · 0 评论 -
并发编程 — 0. 前言
在并发编程之前,首先要了解并发问题的本质原因——计算机内存模型 早期CPU还是单核单线程的时候,并不存在并发问题。但随着科技的发展飞速,CPU发展迅速,计算能力也越来越强,但人类对计算能力的需求也越来越高。为了充分利用CPU,引入了超线程(单个cpu核心能模拟出多个线程)和多核心(多个CPU分工共同完成计算)技术。之后就出现了线程并发问题(其本质就是数据不一致问题)。...原创 2019-12-20 19:02:11 · 149 阅读 · 0 评论