![](https://img-blog.csdnimg.cn/20200923181940696.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程实战
线程八大核心+Java并发底层原理精讲
追忆似水_年华
行路难,行路难,多歧路,今安在
展开
-
Future和Callable-治理线程第二大法宝
文章目录1、Runnable缺陷2、Callable接口3、Future类4、两种用法4.1 用法1:线程池submit方法返回future对象4.2 用法2:用FutureTask创建爱你future5、Future的注意点1、Runnable缺陷Runnable主要有两个缺陷:不能返回一个返回值不能抛出异常2、Callable接口这两点Callable都能做到;Future和Callable配合使用:可以用Future.get来获取Callable接口返回的执行结果,还可以通过F原创 2020-10-04 12:12:18 · 205 阅读 · 0 评论 -
JUC编程之final关键字
目录1.什么是不变性2.final的作用3.三种用法:修饰变量方法类3.1final修饰变量3.1.1 类的final属性3.1.2类中static final属性3.1.3 方法中final变量3.2 final修饰方法3.3 final修饰类4. 面试题5.不变性和final关系(栈封闭)5.1 不可变性5.2 栈封闭1.什么是不变性如果对象被创建后,状态就不能更改,那么就是不可变一旦person的树形被final修饰,就不能再修改,增加可变属性,那么是可变的;对于不可变的对象,一定原创 2020-10-04 10:19:12 · 253 阅读 · 0 评论 -
手撕代码之死锁
class lock1 implements Runnable{ public void run(){ synchronized(Main.l1){ System.out.println("1:我获得了第一个锁"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } s原创 2020-09-21 00:36:28 · 140 阅读 · 0 评论 -
ThreadLocal内存泄漏问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、ThreadLocal内存泄漏1.内存泄漏2.解决方法二、空指针异常1.装箱拆箱导致空指针异常总结一、ThreadLocal内存泄漏1.内存泄漏2.解决方法二、空指针异常1.装箱拆箱导致空指针异常总结提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。...原创 2020-09-23 22:28:45 · 153 阅读 · 0 评论 -
ThreadLocal一次性解决老大难问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档ThreadLocalThreadlocal使用场景一、故事从两个线程开始二、线程池来帮忙,却好心帮坏事1. 10个线程打印日期2、1000个线程打印日期3.使用Synchronized解决线程安全问题4.使用ThreadLocal解决线程安全问题三、 ThreadLocal第二种用法总结两个作用两个场景使用ThreadLocal的好处Threadlocal使用场景 一、故事从两个线程开始 代码如下(示例):package原创 2020-09-23 21:39:07 · 335 阅读 · 1 评论 -
Thread使用start和run方法启动线程有什么区别
写在前头:近期或多或少的去了一些比较优秀的企业面试,现在的企业要求比较高,当然也可能和你面试的岗位有关,一定的工作年限需要有对应的知识的深度和宽度,并且会发现一个特性,就是面试官非常注重你的基础知识的理解和掌握能力,比如说去面试Android开发,但是可能会问你很多的java知识,包括Http和Https,还有网络通信,H5数据交互等等知识点,那么我们应该如何应对这些呢,答案只有一个,多看多理解多积累,毕竟咱们这一行速成容易,精通很难,所以这就是为什么实际工作过的攻城狮和培训出来的人最直接的区别,一个是精通原创 2020-09-22 17:19:30 · 156 阅读 · 0 评论 -
JUC之JMM内存模型面试题
原创 2020-09-09 22:48:40 · 181 阅读 · 0 评论 -
并发进阶之AQS(Semaphore、CountDownLatch和Reentranlock)
一、State状态二、等待队列三、方法原创 2020-09-13 10:17:28 · 185 阅读 · 0 评论 -
JUC并发进阶之阻塞队列
原创 2020-09-13 01:13:59 · 134 阅读 · 0 评论 -
copyonwriteArrayList和concurrenthashmap
一、Hashmap和Concurrenthashmapjava7的concurrenthashmap结构java8的concurrenthashmap结构1.7数据结构segment+链表;采用分段锁的的方式,底层是reentrantlock,发生哈希碰撞采用拉链法;1.8采用键和值不能为null,数据结构node+链表+红黑树;并发度由原来的16变为每个node独立,采用CAS+Synchornized方法;查询复杂度O(N)降为O(logN);当链表元素大于8且数组容量大于64转化为红原创 2020-09-13 00:41:38 · 263 阅读 · 0 评论 -
Semaphore、CyclicBarrier、CountDownLatch
一、CountDownLatchpackage flowcontrol.countdownlatch;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 描述: 工厂中,质检,5个工人检查,所有人都认为通过,才通过 */public class CountDownLa.原创 2020-09-12 21:45:40 · 194 阅读 · 0 评论 -
JUC并发进阶之原子类acomic
原子整数package atomic;import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerDemo1 implements Runnable{ private static final AtomicInteger atomicInteger=new AtomicInteger(); public void incrementAtomic(){ atomi..原创 2020-09-12 17:12:18 · 195 阅读 · 0 评论 -
JUC并发进阶之Reentrantlock可重入锁(递归锁)
一、什么是可重入锁二、用法package lock.reentrantlock;import java.util.concurrent.locks.ReentrantLock;/** * 描述: TODO */public class GetHoldCount { private static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) {原创 2020-09-12 14:45:07 · 237 阅读 · 0 评论 -
JUC并发进阶之锁的分类乐观锁和悲观锁
一、乐观锁和悲观锁举例Git是典型的乐观锁行为package lock.lock;import java.util.concurrent.atomic.AtomicInteger;/** * 描述: TODO */public class PessimismOptimismLock { int a; public static void main(String[] args) { AtomicInteger atomicIntege.原创 2020-09-12 11:18:39 · 225 阅读 · 0 评论 -
JUC并发进阶之lock锁方法Lock,tryLock,lockInterruptibly
一、为什么Synchornized被lock替代二、Lock主要方法1、trylockpackage lock.lock;import java.util.Random;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Reen原创 2020-09-12 10:56:09 · 251 阅读 · 0 评论 -
JUC并发进阶之线程池
一、 线程池参数二、线程执行流程一般任务个数小于核心线程数先创建线程执行任务,大于核心线程数的任务会先安排在等待队列中,如果等待队列也满了的话,会先创建小于线程池线程总数的个数执行任务,如果队列满了之后还有其他任务则会执行拒绝策略。线程执行流程图:线程添加规则:三、线程增加特点 newSchedualThreadPool支持定期和周期执行任务四、线程数量设定 五、线程池的五个方法shutdown、isShutdown、isTreminated、awaitTerminati.原创 2020-09-11 18:47:25 · 105 阅读 · 0 评论 -
JUC高级知识脑图
原创 2020-09-11 01:01:45 · 203 阅读 · 0 评论 -
JUC之活锁问题和饥饿问题
一、活锁是什么死锁和活锁区别代码实例:package deadlock;import java.util.Random;/** * 描述: 演示活锁问题 */public class LiveLock { static class Spoon { private Diner owner; public Spoon(Diner owner) { this.owner = owner; }原创 2020-09-10 14:24:38 · 160 阅读 · 0 评论 -
JUC之死锁问题以及死锁解决方法(银行家算法、银行转账问题、哲学家就餐问题)
一、面试题1、什么是死锁原创 2020-09-10 09:29:51 · 443 阅读 · 0 评论 -
哲学家就餐问题
哲学家进餐问题:五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。分析:放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥访问,可以用一个信号量表示筷子,由这五个信号量构成信号量数组。semaphore chopstick[5] = {1,1,1,1,1};while(true){原创 2020-09-10 00:09:32 · 218 阅读 · 0 评论 -
JUC之JMM内存模型可见性、有序性、原子性
一、可见性Happens-before原则二、有序性三、原子性四、volatile关键字![在这里插入图片描述](https://img-blog.csdnimg.cn/20200909202443943.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4ODQ3MTU0,size_16,color原创 2020-09-09 21:56:47 · 144 阅读 · 0 评论 -
JUC之join和CountDownLatch方法
今天学习CountDownLatch这个类,作用感觉和join很像,然后就百度了一下,看了他们之间的区别。所以在此记录一下。首先来看一下join,在当前线程中,如果调用某个thread的join方法,那么当前线程就会被阻塞,直到thread线程执行完毕,当前线程才能继续执行。join的原理是,不断的检查thread是否存活,如果存活,那么让当前线程一直wait,直到thread线程终止,线程的this.notifyAll 就会被调用。我们来看一下这个应用场景:假设现在公司有三个员工A,B,C,他们要开会原创 2020-09-09 16:55:00 · 280 阅读 · 0 评论 -
JUC生产者和消费者三种实现方式
一、wait和notify:package threadcoreknowledge.threadobjectclasscommonmethods;import java.util.ArrayList;import java.util.Date;import java.util.LinkedList;import java.util.List;/** * 描述: 用wait/notify来实现生产者消费者模式 */public class ProducerConsumerMode原创 2020-09-09 14:29:31 · 216 阅读 · 0 评论 -
JUC面试题总结
原创 2020-09-09 14:16:31 · 457 阅读 · 0 评论 -
JUC课程思维导图
0、课程核心一、八大核心基础二、内存模型三、死锁四、并发工具类原创 2020-09-09 12:32:57 · 411 阅读 · 0 评论 -
JUC之死锁实例
package background;/** * 描述: 第二章线程安全问题,演示死锁。 */public class MultiThreadError implements Runnable { int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { M原创 2020-09-09 11:29:10 · 105 阅读 · 0 评论 -
JUC中断线程两种方式
方式一 catch了InterruptedExcetion之后的优先选择:在方法签名中抛出异常 那么在run()就会强制try/catchpackage threadcoreknowledge.stopthreads;import threadcoreknowledge.createthreads.ThreadStyle;/** * 描述: 最佳实践:catch了InterruptedExcetion之后的优先选择:在方法签名中抛出异常 那么在run()就会强制try/catch */原创 2020-09-09 09:03:14 · 203 阅读 · 1 评论 -
JUC异常分类图解
原创 2020-09-08 18:19:00 · 194 阅读 · 0 评论 -
JUC交替打印0-100的奇偶数
方式1 synchronizedpackage threadcoreknowledge.threadobjectclasscommonmenthods;/** * 描述: 两个线程交替打印0~100的奇偶数,用synchronized关键字实现 */public class WaitNotifyPrintOddEvenSyn { private static int count; private static final Object lock = new Objec原创 2020-09-08 17:20:02 · 243 阅读 · 0 评论 -
JUC图解线程生命周期
线程生命周期:学习内容:提示:这里可以添加要学的内容例如:1、 搭建 Java 开发环境2、 掌握 Java 基本语法3、 掌握条件语句4、 掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:1、 周一至周五晚上 7 点—晚上9点2、 周六上午 9 点-上午 11 点3、 周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如:1、 技术笔记 2 遍2、CSDN 技术博客 3 篇3、 学习的 vlog 视频 1 个...原创 2020-09-08 10:37:19 · 127 阅读 · 0 评论 -
JUC多线程的运行过程
线程生命过程:一、开始线程 面试题:只有调用start()方法才会经历完整的生命周期,run()方法只是调用一个普通方法,不会让子线程执行。二、停止线程:1、普通情况下停止线程/***run方法没有sleep或者wait停止线程*/public class RightWayStopThreadWithoutSleep implements Runnable{@Overridepublic void run() {int num=0;while(!Thread.原创 2020-09-08 10:27:22 · 104 阅读 · 0 评论 -
JUC创建多线程两种方式
创建多线程两种方式一、继承Thread类二、实现Runnable接口方法一:继承Thread类package threadcoreknowledge.createthreads;/** * * 继承Thread类实现线程 * * */public class ThreadStyle extends Thread{ public void run(){ System.out.println("继承Thread类实现线程"); } publ原创 2020-09-07 11:29:27 · 185 阅读 · 0 评论 -
java多线程 —— 面试题集合(最全集合)
1、在java中守护线程和本地线程区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。两者的区别:唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Dae原创 2020-09-06 21:26:25 · 101 阅读 · 0 评论 -
并发之魂:Synchorized深度解析
Synchorized的两个用法一、对象锁包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)类锁指synchorized修饰静态的方法或指定锁为Class对象。第一个用法:对象锁1、代码块形式:指定this为锁对象锁对象默认为this,线程1和2 串行执行package synchornized; /** * * * * 代码块示例1 代码块形式 * * * */public class synchornizedObjectCod原创 2020-09-06 16:31:54 · 276 阅读 · 0 评论