
并发编程
文章平均质量分 96
并发编程
LBXX_1
学习知识,目光坚毅
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Future & CompletionService 的使用(性能优化实战)
创建线程的方式创建线程的方式一般有如下 4 种:继承 Thread 类实现 Runable 接口实现 Callable 接口利用线程池其中,直接继承 Thread 或者实现 Runnable 接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此 java1.5 就提供了 Callable 接口来实现这一场景,配合 Future 和 FutureTask 使用。为什么需要 Callable?Runnable 的缺陷如下:不能返回一个返回值不能原创 2022-04-08 01:13:12 · 1454 阅读 · 1 评论 -
CountDownLatch、CyclicBarrier、Semaphore的用法和区别
CountDownLatchCountDownLatch(也叫闭锁)是一个同步协助类,允许一个或多个线程等待,直到其他线程完成操作集。CountDownLatch 使用给定的计数值(count)初始化。await 方法会阻塞直到当前的计数值(count)由于 countDown 方法的调用达到 0,count 为 0 之后所有等待的线程都会被释放,并且随后对await方法的调用都会立即返回。构造方法//参数count为计数值public CountDownLatch(int count) {};原创 2022-04-04 14:32:36 · 1345 阅读 · 1 评论 -
简单了解 ConcurrentHashMap 在 JDK7 和 JDK8 中的区别
在了解 HashMap 的的原理时,对于 jdk7 和 8 的实现是不同的,同样,对于支持并发的 ConcurrentHashMap 来说其实现也不相同。其主要区别在于两者保证线程安全的机制不同,jdk7 采用的是分段锁的概念,每一个分段都有一把锁,锁内存储的着数据,锁的个数在初始化之后不能扩容。而 jdk8 的 ConcurrentHashMap 数据结构同 HashMap,通过 Synchronized+CAS 来保证其线程安全。jdk7在 jdk7 中,有一个非常重要的概念就是 Segment原创 2022-01-20 20:08:07 · 1357 阅读 · 0 评论 -
面试必问的线程池,简单使用到源码分析「ThreadPoolExecutor」
为什么需要线程池我们知道创建线程的常用方式就是 new Thread(),而每一次new Thread()都会重新创建一个线程,而线程的创建和销毁都需要耗时的,不仅会消耗系统资源,还会降低系统的稳定性。在 jdk1.5 的 JUC包中有一个Executors,他能使我们创建的线程得到复用,不会频繁的创建和销毁线程。线程池首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后原创 2021-10-13 22:22:13 · 427 阅读 · 0 评论 -
读写锁ReentranReadWriteLock源码分析
什么是读写锁在上篇我们聊到了可重入锁ReentrantLcok ,但它也是一把独占锁(也叫排他锁),也就是说在同一时刻只能允许一个线程持有,但在大多数场景下,都是读多写少,并且读并不存在数据竞争的问题,因此也不存在线程安全问题,因此,如果这个时候去使用ReentrantLcok,效率必然低下,所以就有了读写锁ReentrantReadWriteLock。内部结构读写锁也是基于AQS来实现的,其内部维护着一对锁,一个读锁(ReadLock)和一个写锁(WriteLock)。通过分离读锁和写锁,使得并发性原创 2021-10-11 15:26:22 · 260 阅读 · 0 评论 -
阻塞和唤醒线程——LockSupport功能简介及原理浅析
在java并发包下各种同步组件的底层实现中,LockSupport的身影处处可见。JDK中的定义为用来创建锁和其他同步类的线程阻塞原语。*Basic thread blocking primitives for creating locks and other*synchronization classes.我们可以使用它来阻塞和唤醒线程,功能和wait,notify有些相似,但是LockSupport比起wait,notify功能更强大,也好用的多。wait/notify例子public c转载 2021-09-30 10:41:21 · 447 阅读 · 0 评论 -
你真的理解公平锁和非公平锁吗?「ReentranLock源码分析」
阅读本文之前,想想你理解的非公平锁和公平锁是怎样的?再看和我理解的差别在哪里,纯引战,不娱乐????什么是ReentrantLockreentrant 翻译为可重入的,因此从字面上翻译为可重入锁,我们知道可重入是指:同一个线程对于已经获得到的锁,可以多次继续申请到该锁的使用权。ReentrantLock 在调用 lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。如果要实现该特性,则需要解决以下两个问题:线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线原创 2021-09-29 21:31:57 · 487 阅读 · 0 评论 -
Synchronized和Lock你选哪一个
Lock是什么在之前的文章synchronized底层实现说到synchronized是属于JVM层面的锁,而且它只是一个关键字,是不能查看Java源码的,因此我们可以把它当做隐式锁。有了 synchronized 为什么还要 Lock?Lock又是做什么的呢?我们知道synchronized在1.6之前把它叫做重量锁,这时还没有偏向锁和轻量锁级别的优化,因此Doug Lea觉得很不爽,于是就自己开发了一套锁,也就是我们熟知的JUC(java.util.concurrent )包的作者,我们可以叫他并原创 2021-09-24 21:24:02 · 1953 阅读 · 7 评论 -
Synchronized的使用和优化
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁的是当前实例对象;静态同步方法,锁的是当前类的class对象;同步方法块,锁的是括号里面的对象。场景 1、锁对象的改变锁定某对象 o,如果 o 的属性发生改变,不影响锁的使用,但是如果 o 变成另外一个对象,则锁定的对象发生改变,应该避免将锁定对象的引用变成另外一个对象。public class Sync1 { Object o = new Object(); public vo原创 2021-09-23 22:15:31 · 408 阅读 · 0 评论 -
Synchronized底层实现
阅读此文你应该具备以下知识:对象头CASsynchronized是什么如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,我们需要对线程进行同步,在Java中,synchronized 就是实现线程同步的关键字。使用 synchronized 关键字,拿到 Java 对象的锁,保护锁定的代码块。JVM 保证同一时刻只有一个线程可以拿到这个 Java 对象的锁,执行对应的代码块,从而达到线程安全。synchronized的使用synchronized关键字可以用来修饰三个地方原创 2021-09-21 15:22:36 · 1068 阅读 · 2 评论 -
JAVA对象头之锁的膨胀
对象内存布局其实之前在JVM中的对象一文中讲到了对象在JVM中的布局,其中就包括对象头的信息。不了解的可以先看看前面的文章。根据java虚拟机规范里面的描述:java对象分为三部分:对象头(Object Header), 实例数据(instance data),对齐填充(padding)。对象头HotSpot 虚拟机的对象头主要包括两部分(若是数组对象还包括一个数组的长度)信息,对象头在32位系统上占用8bytes,64位系统上占用16bytes(开启压缩指针)。Mark Word,主要存储哈希原创 2021-09-14 18:12:56 · 387 阅读 · 1 评论 -
并发工具类(二)之CountDownLatch
概述闭锁,CountDownLatch 这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。CountDownLatch 是通过一个计数器来实现的,计数器的初始值为初始任务的数量。每当完成了一个任务后,计数器的值就会减 1(CountDownLatch.countDown()方法)。当计数器值到达 0 时,它表示所有的已经完成了任务,然后在闭锁上等待 CountDownLatch.await()方法的线程就可以恢复执原创 2020-07-04 23:24:47 · 251 阅读 · 0 评论 -
并发编程(八)之ReentrantLock
概述可重入锁,简单地讲就是:“同一个线程对于已经获得到的锁,可以多次继续申请到该锁的使用权”。而 synchronized 关键字隐式的支持重进入,比如一个 synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁。ReentrantLock 在调用 lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。该特性的实现需要解决以下两个问题:线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。原创 2020-07-03 18:15:16 · 227 阅读 · 0 评论 -
并发编程(七)之AQS
概述队列同步器 AbstractQueuedSynchronizer(以下简称AQS),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状 态,通过内置的 FIFO 队列来完成资源获取线程的排队工作。并发包的大师(DougLea)期望它能够成为实现大部分同步需求的基础。AQS使用方式和其中的设计模式AQS 的主要使用方式是继承,子类通过继承 AQS 并实现它的抽象方法来管理同步状态,在 AQS 里由一个 int 型的 state 来代表这个状态,在抽象方法的实 现过程中免原创 2020-07-02 10:27:44 · 474 阅读 · 0 评论 -
并发编程(二)之synchronized内置锁
synchronized内置锁每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去。synchronized的使用在学习使用synchronized前,我们原创 2020-07-02 00:19:50 · 311 阅读 · 0 评论 -
并发编程(六)之显示锁Lock
概述Lock是一个接口,提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有的加锁和解锁操作方法都是显示的,因而称为显示锁。有了 synchronized 为什么还要 Lock?Java 程序是靠 synchronized 关键字实现锁功能的,使用 synchronized 关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。特性描述尝试非阻塞地获取锁当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取,则成功获取并持有锁能被中断地获取锁与s原创 2020-06-30 23:57:26 · 240 阅读 · 3 评论 -
并发工具类(一)之ForkJoin
概述CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。什么是原子操作假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么B全部执行完,要么完全不执行B,那么 A 和 B 对彼此来说是原子的。如何实现原子操作实现原子操作可以使用原创 2020-06-29 15:20:18 · 288 阅读 · 0 评论 -
并发编程(三)wait/notify/notifyAll
什么是线程间的协作?线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了 “做什么”(what)和“怎么做”(How),简单的办法是让消费者线程不断地循环检查变量是否符合预期在 while 循环中设置不满足的条件,如果条件满足则退出 while 循环,从而完成消费者的工作。却存在如下问题:难以确保及时性。难以降低开销。如果降低睡眠的时间,比如休眠原创 2020-06-27 22:05:50 · 185 阅读 · 0 评论 -
并发编程(五)之CAS乐观锁
概述CAS:Compare and Swap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。什么是原子操作假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么B全部执行完,要么完全不执行B,那么 A 和 B 对彼此来说是原子的。如何实现原子操作实现原子操作可以使用原创 2020-06-25 22:32:12 · 346 阅读 · 0 评论 -
并发编程(四)之ThreadLocal详解
概述 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,那一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。 ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建了ThreadLocal变量,那么访问原创 2020-06-25 08:56:07 · 778 阅读 · 0 评论 -
并发编程(二)之Java中的线程
概述Java程序天生就是多线程的 一个 Java 程序从 main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是多线程程序,因为执行 main() 方法的是一个名称为 main 的线程。[6] Monitor Ctrl-Break //监控 Ctrl-Break 中断信号的[5] Attach Listener //内存dump,线程 dump,类信息统计,获取系统属性等[4] Signal Dispatcher //分发处理发送给 J原创 2020-06-23 22:39:30 · 283 阅读 · 0 评论 -
并发编程(一)之线程和进程
线程和进程原创 2020-06-18 23:26:18 · 173 阅读 · 0 评论