
Java并发
Yisnow.
这个作者很懒,什么都没留下…
展开
-
submit()和execute()区别
1、接收的参数不同由以上图看出,execute()只能接受Runnable类型参数,而submit()函数还可以接受Callable类型参数;2、有无返回值submit()函数都有返回值Future,而execute()函数没有返回值;3、submit()方便exception处理submit()函数可以通过Future.get()函数可以判断任务是不是执行完成;如果在task里会抛出checked或者unchecked exception,而又希望外面的调用者能够感知这些exce..原创 2020-12-30 16:05:43 · 2678 阅读 · 0 评论 -
CAS机制的ABA问题及解决
1、什么是ABA问题ABA问题:就是说一个线程把数据A变成了B,然后又重新变成了A。此时另一个线程读取的时候发现A没有变化,就误以为还是原来的A。一个ABA例子public class testABA { private static AtomicInteger index=new AtomicInteger(10); public static void main(String[] args) { new Thread(()->{ ind原创 2020-09-26 16:55:14 · 251 阅读 · 0 评论 -
自旋锁和互斥锁的区别
序言最底层的两种锁实现就是互斥锁和自旋锁,许多高级的锁都是基于他们实现的。加锁的目的是保证共享资源在任意时间内,只有一个线程访问,这样就可以避免多线程导致共享数据错乱的问题。当有一个线程加锁成功后,其他线程就会加锁失败。1、互斥锁互斥锁是一种独占锁,当线程A加锁成功后,此时互斥锁已经被线程A独占了,只要线程A没有释放手中的锁,线程B就会失败,就会释放掉CPU给其他线程,线程B加锁的代码就会被阻塞。互斥锁加锁失败而阻塞是由操作系统内核实现的,当加锁失败后,内核将线程置为睡眠状态,等原创 2020-09-17 08:28:10 · 13312 阅读 · 0 评论 -
java并发题
先凑合看吧,等我有时间再画个。。。1、Java的四种线程池newSingleThreadExecutor通俗:创建只有一个线程的线程池,且线程的存活时间是无限的;当该线程正繁忙时,对于新任务会进入阻塞队列中(无界的阻塞队列)适用:一个任务一个任务执行的场景public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService .原创 2020-09-08 09:20:41 · 163 阅读 · 0 评论 -
Java的CopyOnWrite机制
序言 Copy-on-write简称COW,是一种延时懒惰策略。当我们王一个容器添加元素时,不直接往当前容器添加,而是将当前容器copy,复制出一个新的容器,在新容器中添加元素,添加之后,将原容器堆得引用指向新的容器。 这样就可以对CopyOnWrite容器进行并发的读,而不需要加锁。CopyOnWrite也是一种读写分离的思想,读和写使用不同的容器。 Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,CopyOnWriteArrayList 、CopyOnWriteArr原创 2020-09-06 10:36:36 · 741 阅读 · 0 评论 -
深度解读+java+线程池设计思想及源码实现
我相信大家都看过很多的关于线程池的文章,基本上也是面试的时候必问的,如果你在看过很多文章以后,还是一知半解的,那希望这篇文章能让你真正的掌握好 Java 线程池。本文一大重点是源码解析,同时会有少量篇幅介绍线程池设计思想以及作者 Doug Lea 实现过程中的一些巧妙用法。本文还是会一行行关键代码进行分析,目的是为了让那些自己看源码不是很理解的同学可以得到参考。线程池是非常重要的工具,如果你要成为一个好的工程师,还是得比较好地掌握这个知识,很多线上问题都是因为没有用好线程池导致的。即使你为了谋生,也要知转载 2020-08-11 11:31:37 · 205 阅读 · 0 评论 -
Java并发5:ReentrantReadWriteLock原理
1、写锁上锁流程// WriteLockstatic final class NonfairSync extends Sync { // ... 省略无关代码 // 外部类 WriteLock 方法, 方便阅读, 放在此处 public void lock() { sync.acquire(1); } // AQS 继承过来的方法, 方便阅读, 放在此处 public final void acquire(int arg) { if ( // 尝试获得写锁失败 !tryAcq原创 2020-08-09 21:51:33 · 259 阅读 · 0 评论 -
Java并发8:HashMap和ConcurrentHashMap解析
目录1、Java7 HashMap2、Java7 ConcurrentHashMap并发问题分析3、Java8 HashMap4、Java8 ConcurrentHashMap1、Java7 HashMap会出现死链,究其原因,是因为在多线程环境下使用了非线程安全的 map 集合。JDK 8 虽然将扩容算法做了调整,不再将元素加入链表头(而是保持与扩容前一样的顺序),但仍不意味着能够在多线程环境下能够安全扩容,还会出现其它问题(如扩容丢数据)。2、Java7 ConcurrentHashMap整转载 2020-08-09 21:33:46 · 323 阅读 · 0 评论 -
Java并发7:阻塞队列BlockingQueue
1、BlockingQueueBlockingQueue 是一个先进先出的队列(Queue),为什么说是阻塞(Blocking)的呢?是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻塞等待队列中有元素再返回;也支持添加元素时,如果队列已满,那么等到队列可以放入新元素时再放入。BlockingQueue 是一个接口,继承自 Queue,所以其实现类也可以作为 Queue 的实现来使用,而 Queue 又继承自 Collection 接口。BlockingQueue 不接受 nu原创 2020-08-09 19:28:41 · 418 阅读 · 0 评论 -
Java并发6:CountDownLatch &CyclicBarrier &Semaphore
0、前言这篇博客是AQS共享模式的应用。主要包括三个:SemaphoreCountDownLatchCyclicBarrier1、CountDownLatchCountDownLatch 非常实用,我们常常会将一个比较大的任务进行拆分,然后开启多个线程来执行,等所有线程都执行完了以后,再往下执行其他操作。构建出这么一个场景:有 m 个线程是做任务的,有 n 个线程在某个栅栏上等待这 m 个线程做完任务,直到所有 m 个任务完成后,n 个线程同时通过栅栏。源码构造方法,需要传入一个不小于原创 2020-08-09 17:16:58 · 185 阅读 · 0 评论 -
Java并发4:ReentrantLock原理
前言主要用到AQS的并发工具类:ReentrantLock和AQS的关系ReentrantLock 在内部用了内部类 Sync 来管理锁,所以真正的获取锁和释放锁是由 Sync 的实现类来控制的。Sync 有两个实现,分别为 NonfairSync(非公平锁)和 FairSync(公平锁)。默认是非公平锁public ReentrantLock() { sync = new NonfairSync();}1、非公平锁实现原理加锁流程没有竞争时:第一个竞争出现时:Thr原创 2020-08-09 14:13:59 · 258 阅读 · 0 评论 -
Java并发3:AQS原理
1、原创 2020-08-09 10:03:04 · 145 阅读 · 0 评论 -
Java并发2:synchronized 原理
0、前言不管是轻量级锁还是重量级锁,其语法都是synchronized。锁一共有4个状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁、重量级锁;锁可以升级但是不可以降级;CASCAS使用了三个基本操作数:内存地址V,旧的预期值A,要修改的新值B。只有当A与V中保存的实际值相同时才会将V保存的值修改为B;Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新1、Java对象原创 2020-08-09 08:59:13 · 168 阅读 · 0 评论 -
Java并发1:volatile原理
1、volatile特性可见性:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。有序性:禁止进行指令重排序只能保证对单次读写的原子性:i++这种操作不能保证原子性;2、volatile原理volatile 的底层实现原理是内存屏障,Memory Barrier(Memory Fence)volatile 变量的写指令后会加入写屏障对 volatile 变量的读指令前会加入读屏障3、如何保证可见性写屏障保证在该屏障之前的对原创 2020-08-08 21:11:00 · 121 阅读 · 0 评论