JUC
文章平均质量分 77
Java高并发及多线程
刘小豆豆豆
路漫漫其修远兮,吾将上下而求索!
展开
-
Synchronized锁
Synchronized1.1 原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。但是像i++、i+=1等操作字符就不是原子性的,它们是分成读取、计算、赋值几步操作,原值在这些步骤还没完成时就可能已经被赋值了,那么最后赋值写入的数据就是脏数据,无法保证原子性。被synchronized修饰的类或对象的所有操作都是原子的,因为在执行操作原创 2021-03-23 20:40:45 · 94 阅读 · 0 评论 -
LockSupport
LockSupport用于创建锁和其他同步类的基本线程阻塞原语。LockSupport其实就是对线程等待唤醒机制(wait/notify)的改良版。什么是LockSupport?通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作LockSupport是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根结底,LockSupport调用的Unsafe中的native代码。官网解释:LockSupport是用来创建锁和其他原创 2021-03-23 18:39:10 · 68 阅读 · 0 评论 -
Java线程池工作原理、拒绝策略以及自定义线程池详解
线程池为什么用线程池线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来。主要特点为:线程复用、控制最大并发数,管理线程。降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度,当任务到达时,任务可以不需要等到线程创建(已经创建好了)就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的原创 2021-03-20 21:12:33 · 483 阅读 · 0 评论 -
线程池预热之Callable
Callablecallable和Runnable的区别是callable可以有返回值,也可以抛出异常的特性,Callable实现多线程: 将实现Callable接口的实现类丢尽FutureTask 中,然后再将futureTask放进Thread类中,用到了适配者模式,面向接口的编程(参数都是接口,因为一个类可以实现多个接口,因此实现了其接口的类都有作为参数)。 注意:多个线程抢一个FutureTask,只计算一次call里的内容,想要计算多次需要起多个FutureTask。public c原创 2021-03-20 21:06:40 · 773 阅读 · 0 评论 -
AQS及ReentrantLock的底层原理
写在前面,本文受启与养兔子的大神,并在他文章的基础上添加了一些自己的理解。AQS(Abstract Queued Synchronzied)AQS的底层其实就是 “操作系统基础” 中的状态量和锁的V-P操作。AQS就是JDK中为“线程同步”提供的一套基础工具类,其实就是一个类而已,其上文讲到的同步组件(CountDownLatch,CyclicBarrier,Semaphore)(因此AQS就成了非常重要的一个知识点,因为基于它可以写出JAVA中的很多“锁”类。比如此文要分析的ReentrantLoc原创 2021-03-20 11:29:57 · 299 阅读 · 0 评论 -
阻塞队列(BlockingQueue)实现生产消费模式并手写一个阻塞队列
阻塞队列(BlockingQueue)什么是阻塞队列?阻塞队列 是一种数据结构,它是一个队列,可以存放0到N个元素。我们可以对这个队列执行插入或弹出元素操作,弹出元素操作就是获取队列中的第一个元素,并且将其从队列中移除;而插入操作就是将元素添加到队列的末尾。当队列中没有元素时,对这个队列的弹出操作将会被阻塞,直到有元素被插入时才会被唤醒;当队列已满时,对这个队列的插入操作就会被阻塞,直到有元素被弹出后才会被唤醒。在线程池中,往往就会用阻塞队列来保存那些暂时没有空闲线程可以直接执行的任务,等到线程空闲之原创 2021-03-19 21:59:07 · 243 阅读 · 0 评论 -
Condition的signal()和Synchronized的notiy()的区别,一文弄懂!
Condition的signal()和Synchronized的notiy()的区别,一文弄懂!Condition中的 await() 方法相当于 Object 的 wait() 方法,Condition中的 signal() 方法相当于Object的notify()方法,Condition中的 signalAll() 相当于Object的notifyAll()方法。不同的是,Object中的这些方法是和同步锁捆绑使用的;而Condition是需要与互斥锁/共享锁捆绑使用的。Condition它原创 2021-03-19 18:59:59 · 483 阅读 · 0 评论 -
Synchronized 与Lock(ReentrantLock)区别
Synchronized 与Lock(ReentrantLock)区别:原始构成sync 是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步代码块或方法中才能调用wait/notify等方法)Lock 是具体类(JUC包下的)是API层面的锁。使用方法:synchronized 不需要用户去手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用原创 2021-03-19 18:53:39 · 246 阅读 · 0 评论 -
CountDownLatch / CyclicBarrier /Semaphore
CountDownLatch 工作原理CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量;调用await()方法的线程会被阻塞,直到计数器 减到 0 的时候,才能继续往下执行。调用了await()进行阻塞等待的线程,它们阻塞在Latch门闩/栅栏上;只有当条件满足的时候(countDown() N次,将计数减为0),它们才能同时通过这个栅栏;以此能够实现,让所有的线程站在一个起跑线上。CountDownLatch 的源码在JUC并发工具中,也相对算是简单的;底层基于 A原创 2021-03-19 11:15:00 · 137 阅读 · 0 评论 -
Java锁之公平锁/可重入锁/读写锁/自旋锁
Java锁在java中,锁是实现并发的关键组件,多个线程之间的同步关系需要锁来保证,所谓锁,其语义就是资源获取到资源释放的一系列过程,使用lock的意图就是想要进入临界区对共享资源执行操作,使用unlock说明线程已经完成了相关工作或者发生了异常从而离开临界区释放共享资源,可以说,在多线程环境下,锁是一个必不可少的组件。我们最为常用的并发锁是synchronized关键字,在最新的jdk中,synchronized的性能已经有了极大的提升了,而且未来还会对它做更进一步的优化,最为重要的是synchroni原创 2021-03-18 21:54:35 · 234 阅读 · 1 评论 -
线程不安全集合类源码剖析及解决方案
线程不安全集合类及源码剖析:常用的线程不安全集合:ArrayListLinkedListArraySetHashMap不安全集合之List1.ArrayList举一个List线程不安全的例子: 开10个线程对List进行添加并访问。public static void main(String[] args) { //新建一个ArrayList集合 List<String> strings = new ArrayList<>(); for原创 2021-03-18 15:30:11 · 93 阅读 · 0 评论 -
CAS实现原理、Atomic类以及ABA问题
CAS是什么?compareAndSwapCAS全称为Compare - And -Swap ,它是一条CUP并发原语。CAS 被认为是一种乐观锁。Java中CAS操作的执行依赖于Unsafe类的方法。它的功能是判断内存某个位置的值是否为预测值,如果是则更改为新的值,这个过程是原子的 ,volatile可以跟CAS配合保证原子性。CAS并发原语体现在Java语言就是sun.misc.Unsafe类中的各个方法,调用Unsafe类中的CAS方法,JVM就会帮我们实现出CAS汇编指令。这是一种完全依赖于硬原创 2021-03-17 19:10:17 · 113 阅读 · 0 评论 -
Volatile的可见性、不保证原子性、指令重排及JMM分析
1.volatilevolatile 是Java虚拟机提供的轻量级(轻量级synchronized)的同步机制。volatile 的特性:保证可见性:JMM内存模型中(下文),如果线程A将工作内存的变量修改后写入主内存中,要保证线程B拷贝主内存的变量值是最新值。如何保证可见性:volatile 关键字通过内存屏障禁止了指令的重排序,并在单个核心中,强制数据的更新及时更新到缓存。在此基础上,依靠多核心处理器的缓存一致性协议等机制**,保证了变量的可见性。分析如下一段代码,明白什么是可见性。原创 2021-03-17 10:21:16 · 157 阅读 · 0 评论