![](https://img-blog.csdnimg.cn/20200110125611796.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
从基础开始逐渐深入学习JAVA高并发编程,博主也是刚开始学,有错误的话,还请大家留言指正。也为了方便以后面试复习用。
ITKaven
ACMER
本科软件工程专业
硕士计算机技术专业
专注于WEB开发的烟酒僧
展开
-
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用
Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。Java并发之AQS详解CountDownLatchCountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程。我们首先来看看怎么实现一个线程等待多个线程吧...原创 2020-02-20 15:25:50 · 1060 阅读 · 0 评论 -
Java并发编程一Condition初使用
Java并发编程一Condition初使用Condition是什么?Condition是在Java1.5中才出现的,它用来替代传统Object中的wait()、notify(),实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列...原创 2020-02-19 23:07:44 · 889 阅读 · 0 评论 -
BlockingQueue(阻塞队列)详解
BlockingQueue(阻塞队列)详解原文地址BlockingQueue一. 前言在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。二. 认识Bl...转载 2020-02-19 20:25:35 · 1789 阅读 · 0 评论 -
Java并发之AQS详解
Java并发之AQS详解原文地址Java并发之AQS详解1、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountD...转载 2020-02-19 17:18:48 · 934 阅读 · 0 评论 -
ArrayList和CopyOnWriteArrayList
ArrayList和CopyOnWriteArrayList原文地址ArrayList和CopyOnWriteArrayList这篇文章的目的如下:了解一下ArrayList和CopyOnWriteArrayList的增删改查实现原理。看看为什么说ArrayList查询快而增删慢?CopyOnWriteArrayList为什么并发安全且性能比Vector好。1. List接口首...转载 2020-02-19 10:41:33 · 1122 阅读 · 2 评论 -
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析原文地址Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析正文今天发一篇"水文",可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍。本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的。网上关于 HashMap 和 Concu...转载 2020-02-18 21:57:22 · 832 阅读 · 0 评论 -
Java并发编程一引用类型、升级类型原子类初使用加源码分析
Java并发编程一引用类型、升级类型原子类初使用加源码分析首先我们来看一看有哪些原子类。现在我们来看看该如何去使用这些引用类型、升级类型原子类吧。之前已经介绍过基本类型、数组类型原子类和累加器的使用了,讲过的原理这里就不会再涉及了,想了解就看下面这篇博客吧。Java并发编程一基本类型、数组类型原子类和累加器初使用加源码分析AtomicReferenceAtomicReference...原创 2020-02-18 13:33:14 · 1741 阅读 · 0 评论 -
Java并发编程一基本类型、数组类型原子类和累加器初使用加源码分析
Java并发编程一基本类型原子类初使用加源码分析首先我们来看一看有哪些原子类。现在我们来看看该如何去使用这些原子类吧。AtomicInteger代码:package atomic;import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerDemo1 implements Runnabl...原创 2020-02-18 11:39:51 · 775 阅读 · 0 评论 -
Java并发编程一ReentrantReadWriteLock初使用
Java并发编程一ReentrantReadWriteLock初使用ReentrantReadWriteLock是一种读写锁,从类名也可以看出来。ReentrantReadWriteLock类有两个属性ReentrantReadWriteLock.ReadLock readerLock(代表读锁)、ReentrantReadWriteLock.WriteLock writerLock(代表写锁...原创 2020-02-17 23:11:49 · 783 阅读 · 0 评论 -
Java并发编程一Lock和ReentrantLock初使用
Java并发编程一Lock初使用首先我们来演示一下两个线程不断的打印两个字符串。代码package lock.reentrantlock;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 描述: 演示ReentrantLock的基本用法,演示被打...原创 2020-02-17 20:42:04 · 865 阅读 · 0 评论 -
分门别类总结Java中的各种锁,让你彻底记住
分门别类总结Java中的各种锁,让你彻底记住原文地址分门别类总结Java中的各种锁,让你彻底记住前言本文需要具备一定的多线程基础才能更好的理解。学习Java多线程时,最头疼的知识点之一就是Java中的锁了,什么互斥锁、排它锁、自旋锁、死锁、活锁等等,细分的话可以罗列出20种左右的锁,光是看着这些名字就足以让人望而却步了,更别说一个个去理解它们的含义了。其实我要在这里告诉大家,我们看到的其...转载 2020-02-17 16:58:48 · 870 阅读 · 0 评论 -
Java并发编程一ThreadLocal初使用
Java并发编程一ThreadLocal初使用任务为了方便使用以及展现ThreadLocal的优点,首先给出一个任务,然后根据任务的并发数去迭代代码,我们假设每个线程的任务很简单,就是打印我们要求的时间,具体看代码。现在我们只需要两个线程去打印时间。代码一package threadlocal;import java.text.SimpleDateFormat;import jav...原创 2020-02-17 15:12:25 · 717 阅读 · 0 评论 -
ThreadLocal-面试必问深度解析
ThreadLocal-面试必问深度解析原文地址ThreadLocal-面试必问深度解析ThreadLocal是什么ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景。从数据结构入手下图为ThreadLocal的内部结构...转载 2020-02-17 13:53:10 · 1273 阅读 · 0 评论 -
Java并发编程一线程池的五种状态
Java并发编程一线程池的五种状态原文地址Java多线程线程池(4)–线程池的五种状态正文线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。线程池各个状态切换框架图:RUNNING状态说明:线程池处在RUNNING状态时,能够接收新任务(线程池没有满的情况下),以及对已添加的任务进行处理。状态切换:线程池的初始化状态是RUNNI...转载 2020-02-16 12:08:20 · 759 阅读 · 0 评论 -
Java并发编程一如何关闭线程池
Java并发编程一如何关闭线程池当线程池中已经有大量线程在处理任务,并且任务队列中也有很多任务在等待被处理,这个时候我们该如何去关闭线程池呢?首先我们来创建一个任务。任务ShutDownTask类实现了Runnable接口,它的run()就是我们线程所要执行的任务,我们这里的任务非常简单,就是输出自己(当前线程)的名称,再sleep(500)即可。class ShutDownTask i...原创 2020-02-16 11:32:55 · 1347 阅读 · 0 评论 -
Java并发编程一四种常用线程池简述
Java并发编程一四种常用线程池简述我们使用线程是用来执行任务的,所以,首先我们得有一个任务,这里我们定义线程的任务很简单,就是输出自己(当前线程)的name,为了方便观察,每个线程的执行逻辑中sleep(500)。任务Task类,实现了Runnable接口。package threadpool;class Task implements Runnable { @Overri...原创 2020-02-15 23:23:50 · 767 阅读 · 2 评论 -
Java并发编程一线程池简介
Java并发编程一线程池简介为什么我们需要使用线程池?我们知道线程是一种比较昂贵的资源,我们通过程序每创建一个线程去执行,其实操作系统都会对应地创建一个线程去执行我们的任务,而我们频繁的创建、销毁线程是非常耗费系统资源的,当并发数不大时,对系统似乎没什么影响,但当并发数很大时,我们为每一个请求都创建一个线程,然后等待被调度、执行完任务后再销毁,这样是很耗费服务器资源的。而我们使用线程池去管理...原创 2020-02-15 21:43:06 · 1240 阅读 · 0 评论 -
死锁、饥饿和活锁
死锁、饥饿和活锁原文地址Java并发编程系列之十二:死锁、饥饿和活锁正文死锁发生在一个线程需要获取多个资源的时候,这时由于两个线程互相等待对方的资源而被阻塞,死锁是最常见的活跃性问题。这里先分析死锁的情形:假设当前情况是线程A已经获取资源R1,线程B已经获取资源R2,之后线程A尝试获取资源R2,这个时候因为资源R2已经被线程B获得了,所以线程A只能阻塞直到线程B释放资源R2。另一方面,...转载 2020-02-15 15:09:59 · 773 阅读 · 0 评论 -
线程的属性
线程的属性原文地址多线程学习(三)—— 线程的属性线程属性概览属性名称用途注意事项ID每个线程都有自己的ID,用于识别不同的线程被后续创建的线程使用;不允许被修改Name便于用户在开发、调试或运行过程中区分每个不同的线程、定位问题等清晰有意义的名字;默认的名称isDaemontrue:代表是守护线程,false:非守护线程(用户线程)继承父线程...转载 2020-02-14 22:04:32 · 1123 阅读 · 0 评论 -
Thread和Object中的重要方法详解
Thread和Object类中的重要方法详解原文地址多线程学习(二)——Thread和Object类中的重要方法详解方法概览类方法名简介Threadsleep相关sleep的相关重载方法join等待其他线程执行完毕yield相关放弃已获得的CPU资源currentThread获取当前执行线程的引用start, run相关启动...转载 2020-02-14 21:56:32 · 1134 阅读 · 0 评论 -
停止线程的正确姿势
停止线程的正确姿势原文地址Java线程状态和关闭线程的正确姿势正文线程的run()方法正常执行完毕之后线程就正常死亡进入TERMINATED状态了,那么如果我们有中途停止线程的需求,我们应该如何正确的结束一个线程呢?使用interrupt()方法在线程内部,其定义了一个变量来标识当前线程是否处于被打断状态,调用interrupt()方法则使这个状态变为true;换句话说,线程在阻塞状态...转载 2020-02-14 21:03:53 · 828 阅读 · 0 评论 -
Java线程状态及转换
Java线程状态及切换原文地址Java线程状态和关闭线程的正确姿势正文Java中的线程有六种状态,使用线程Thread类的枚举类来实现,如下,我对每个状态都进行了一定的解释。public enum State { /** 表示一个线程还没启用(即未调用start方法)*/ NEW, /** * JVM中执行的线程都是处于...转载 2020-02-14 20:44:33 · 870 阅读 · 0 评论 -
启动线程的正确姿势
启动线程的正确姿势通过之前的分析,我们知道有两种定义线程执行逻辑的方法,而创建线程只有一种方法,也就是new一个Thread类的实例。JAVA实现多线程到底有多少种方法?哪种方法更好呢?...原创 2020-02-14 16:54:33 · 917 阅读 · 2 评论 -
Java线程的概念:什么是线程?
Java线程的概念:什么是线程?世间万物都可以同时完成很多工作。例如,人体可以同时进行呼吸、血液循环、思考问题等活动。用户既可以使用计算机听歌,也可以编写文档和发送邮件,而这些活动的完成可以同时进行。这种同时执行多个操作的“思想”在 Java 中被称为并发,而将并发完成的每一件事称为线程。在 Java 中,并发机制非常重要,但并不是所有程序语言都支持线程。在以往的程序中,都以一个任务完成以后再...转载 2020-02-14 14:19:47 · 1707 阅读 · 0 评论 -
Java并发编程汇总
基础正文JAVA实现多线程到底有多少种方法?哪种方法更好呢?深入浅出 synchronizedJava中Volatile关键字详解扩展阅读双重检查锁单例模式为什么要用volatile关键字?未完待续...原创 2020-02-09 12:37:30 · 2048 阅读 · 7 评论 -
深入浅出 synchronized
原文地址:深入浅出synchronizedsynchronized可以保证方法或代码块在运行时,同一时刻只有一个线程可以进入到临界区(互斥性),同时它还保证了共享变量的内存可见性。Java中的每个对象都可以作为锁。普通同步方法,锁是当前实例对象。静态同步方法,锁是当前类的class对象。同步代码块,锁是括号中的对象。先看一个场景等待 / 通知机制直接上代码:import ...转载 2018-11-14 09:32:54 · 1699 阅读 · 0 评论 -
Java中Volatile关键字详解
原文链接:Java中Volatile关键字详解一、基本概念先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。可见性,是指线程之间的可见性,一个线程修改的...转载 2018-10-30 09:23:22 · 1713 阅读 · 0 评论 -
双重检查锁单例模式为什么要用volatile关键字?
原文链接前言从Java内存模型出发,结合并发编程中的原子性、可见性、有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景;在这补充一点,分析下volatile是怎么在单例模式中避免双检锁出现的问题的。并发编程的3个条件1 原子性:要实现原子性方式较多,可用synchronized、lock加锁,AtomicInteger等,但v...转载 2020-01-12 11:38:49 · 5936 阅读 · 0 评论 -
Java实现多线程到底有多少种方法?
可以去百度一下,答案有很多。到底有原创 2020-01-10 13:32:35 · 5026 阅读 · 3 评论