![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
背着电脑去搬砖
码龄4年
展开
-
悲观锁和乐观锁
悲观锁概念总是假设最坏的情况,每次去拿数据的时候都认为被人会修改,所以每次去拿数据的时候都会上锁。多用于多写的情况实现java中synchronize和ReentrantLock等独占锁及时悲观锁思想的实现乐观锁概念总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。多用于多读的情况,提高吞吐量实现使用版本号机制和CAS算法实现版本号机制一般是在数据库表中添加一个数据版本号version字段,表示数据更新的原创 2020-06-07 15:22:43 · 209 阅读 · 0 评论 -
深入理解CyclicBarrier
引言jdk1.5开始,引入了一个类java.util.concurrent.CyclicBarrier用来控制多个线程互相等待,只有当多个线程都到达时,这些线程才会继续执行。与CountDownLatch不同的是,CyclicBarrier实例是可以重复使用的,也被称为重复栅栏使用class CyclicBarrierAgainDemo implements Runnable{ @Override public void run() { System.out.print("原创 2020-06-06 17:55:51 · 335 阅读 · 0 评论 -
深入理解线程池
什么是线程池线程是一种昂贵的资源,其主要开销分为以下几个方面:线程的创建和启动的开销线程销毁的开销线程调度的开销。线程的调度会导致上下文切换,从而增了了处理器资源的消耗因此,我们需要一种有效的使用线程的方式,线程池就是一种常见的方式。线程池的优势降低创建线程和销毁线程的性能开销提高响应速度,当有新任务需要执行是不需要等待线程创建就可以立马执行合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题线程池的使用线程池在java中是如何实现的呢?在 JDK 1.5 之后推原创 2020-06-05 16:48:52 · 284 阅读 · 0 评论 -
深入理解ConcurrentHashMap(JDK8)
前言前面我们讲了HashMap的源码,知道HashMap是线程不安全的。今天我们就来讲一讲在JUC( java.util.concurrent)并发包中线程安全的HashMap-----ConcurrentHashMap想了解HashMap源码的同学可以去看之前的文章链接: 深入理解HashMap(JDK8)ConcurrentHashMap源码注意:我会把源码中每个方法的作用都注释出来,可以参考注释进行理解。put() final V putVal(K key, V value, b原创 2020-06-04 19:47:02 · 602 阅读 · 0 评论 -
深入理解HashMap(JDK8)
什么是Hash表Hash表,也叫散列表,是一种重要的数据结构,这种数据结构提供了Key和Value的映射关系。时间复杂度接近于O(1)Hash函数Hash表的本质也是一个数组,那它是怎么把key转换成数组的下标的呢?这里,就通过Hash函数将Key和数组下标进行转换。如图:Hash冲突由于数组的长度是有限的,当插入的entry越来越多时,两个不同的元素,通过hash函数获得的下标相同的概率就会越来越大,这种两个下标相同的情况就叫做Hash冲突Hash冲突解决办法开放寻址法:也叫线性探索。如原创 2020-06-03 21:16:13 · 465 阅读 · 0 评论 -
深入理解CountDownLatch
概念CountDownLatch可以用来实现一个或者多个线程等待其他线程完成一组特定的操作之后才能继续运行。这组操作被称为先决操作使用public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(2); new Thread(()->{ System.out.println(Thread.c原创 2020-06-02 20:21:52 · 527 阅读 · 0 评论 -
深入理解条件变量Condition
概念Condition是JDK1.5引入的新的标准库java.util.concurrent.locks.Condition接口。Condition接口可作为wait/notify的替代品来实现等待/通知,它为解决过早唤醒问题提供了支持,并解决了Object.wait(long)不能区分返回是否是由于等待超时导致的问题。Condition实例可以通过Lock.newCondition()来获取,也就是说任意一个显示锁实例的newCondition方法都可以获得一个Condition实例。而Objec原创 2020-06-01 15:26:00 · 691 阅读 · 0 评论 -
深入理解ReentrantLock
锁的分类按照Java虚拟机对锁的实现方式划分,Java平台中锁可分为内部锁和显示锁内部锁:也被称为监视器锁,是一种排他锁,也就是独占锁,是通过synchronized关键字实现,在我们之前 深入理解synchronized关键字文章中有详细分析显示锁:自jdk1.5开始引入的排他锁,是通过java.concurrent.locks.Lock接口的实现类,起作用与内部锁相同。它提供了一些内部锁不具备的特性。但并不是内部锁的替代品LockLock接口的实现类:ReentrantLock:重入锁原创 2020-05-30 19:21:57 · 546 阅读 · 2 评论 -
深入理解ThreadLocal
ThreadLocal是什么?ThreadLocal实例为每一个访问它的线程(即当前线程)都关联了一个该线程的线程特有对象线程特有对象(TSO,Thread Specific Object):各个线程创建各自的实例,一个实例只能被一个线程访问的对象就被称为线程特有对象,相对应的线程就被称为该线程特有对象的持有线程ThreadLocal的使用static ThreadLocal<Integer> local = new ThreadLocal<Integer>() {原创 2020-05-29 18:15:14 · 352 阅读 · 2 评论 -
深入理解volatile 关键字
一个可见性问题引发的思考我们下来看一段代码:public static boolean flg =false; public static void main(String[] args) throws InterruptedException { Thread thread=new Thread(()->{ int i=0; while (!flg){ i++;原创 2020-05-28 18:40:54 · 348 阅读 · 0 评论 -
深入理解synchronized关键字
一个问题引发的思考public class App { public static int count=0; public static void incr(){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } count++; } public原创 2020-05-27 20:36:51 · 450 阅读 · 0 评论 -
线程的生命周期及五种基本状态
线程的创建1. 继承Thread类特点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。public class TestDemo extends Thread{ @Override public void run() { //线程会执行的指令 System.out.println("Come in"); } public static void main(St原创 2020-05-26 18:57:24 · 1137 阅读 · 0 评论