java多线程
文章平均质量分 68
god_love_hlq_xff
这个作者很懒,什么都没留下…
展开
-
深入理解ThreadLocal的原理
final ThreadLocal<String> threadLocal = new ThreadLocal<>(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { //...原创 2019-06-13 20:45:29 · 342 阅读 · 0 评论 -
分析 ArrayBlockingQueue 构造函数加锁问题
http://www.iocoder.cn/JUC/sike/ArrayBlockingQueue-construction-lock/1. 问题昨天有位小伙伴问我一个 ArrayBlockingQueue 中的一个构造函数为何需要加锁,其实这个问题我还真没有注意过。主要是在看 ArrayBlockingQueue 源码时,觉得它很简单,不就是通过加锁的方式来操作一个数组 items 么,...转载 2018-10-14 22:34:20 · 268 阅读 · 0 评论 -
J.U.C 之线程池:ScheduledThreadPoolExecutor
http://www.iocoder.cn/JUC/sike/ScheduledThreadPoolExecutor/ ScheduledThreadPoolExecutor解析我们知道Timer与TimerTask虽然可以实现线程的周期和延迟调度,但是Timer与TimerTask存在一些缺陷,所以对于这种定期、周期执行任务的调度策略,我们一般都是推荐ScheduledThreadPoo...转载 2018-10-14 22:33:42 · 206 阅读 · 0 评论 -
J.U.C 之线程池:ThreadPoolExecutor
http://www.iocoder.cn/JUC/sike/ThreadPoolExecutor/作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, S...转载 2018-10-14 22:32:56 · 158 阅读 · 0 评论 -
J.U.C 之线程池:线程池的基础架构
http://www.iocoder.cn/JUC/sike/ThreadPool-core/ 1. 简介经历了 Java 内存模型、J.U.C 基础之 AQS 、CAS 、Lock 、并发工具类、并发容器、阻塞队列、Atomic 类后,我们开始 J.U.C 的最后一部分:线程池。在这个部分你将了解到下面四个部分:线程池的基础架构 线程池的原理分析 线程池核心类的源码分析 线程池...转载 2018-10-14 22:32:07 · 183 阅读 · 0 评论 -
深入分析 ThreadLocal
http://www.iocoder.cn/JUC/sike/ThreadLocal/ThreadLocal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底...转载 2018-10-13 22:14:46 · 226 阅读 · 0 评论 -
J.U.C 之阻塞队列:BlockingQueue 总结
http://www.iocoder.cn/JUC/sike/BlockingQueue/经过前面六篇博客的阐述,我想各位应该对阻塞队列BlockingQueue有了较为深入的理解,下面来一个总结,先看整个类图:BlockingQueueBlockingQueue接口实现Queue接口,它支持两个附加操作:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。相对于同一操作他...转载 2018-10-13 22:13:58 · 155 阅读 · 0 评论 -
J.U.C 之 AQS:CLH 同步队列
http://www.iocoder.cn/JUC/sike/aqs-1-clh/1. 简介CLH 同步队列是一个 FIFO 双向队列,AQS 依赖它来完成同步状态的管理:当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程 当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。...转载 2018-10-13 22:12:51 · 145 阅读 · 0 评论 -
J.U.C 之 AQS:AQS 简介
http://www.iocoder.cn/JUC/sike/aqs-0-intro/Java 的内置锁一直都是备受争议的,在 JDK 1.6 之前,synchronized 这个重量级锁其性能一直都是较为低下,虽然在 1.6 后,进行大量的锁优化策略(《【死磕 Java 并发】—– 深入分析 synchronized 的实现原理》),但是与 Lock 相比 synchronized 还是存在...转载 2018-10-13 22:11:53 · 187 阅读 · 0 评论 -
ConcurrentHashMap的实现
HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。故而Doug Lea大神给我...转载 2018-10-07 11:36:03 · 241 阅读 · 0 评论 -
ConcurrentLinkedQueue 非阻塞队列
要实现一个线程安全的队列有两种方式:阻塞和非阻塞。阻塞队列无非就是锁的应用,而非阻塞则是CAS算法的应用。下面我们就开始一个非阻塞算法的研究:CoucurrentLinkedQueue。ConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算法(即CAS算法)来实现的。CoucurrentLinked...转载 2018-10-07 11:33:47 · 284 阅读 · 0 评论 -
jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作。Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韩国人,写在JDK 1.8发布之前,虽然有些地方有些许过时,但整体内容还是非常有价值的。译者此前也看到...转载 2018-10-17 22:00:05 · 186 阅读 · 0 评论 -
J.U.C 之阻塞队列:ArrayBlockingQueue
http://www.iocoder.cn/JUC/sike/ArrayBlockingQueue/1. 简介ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用 FIFO 的原则对元素进行排序添加的。ArrayBlockingQueue 为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue 支持对等待...转载 2018-10-08 21:58:03 · 305 阅读 · 0 评论 -
J.U.C 之阻塞队列:PriorityBlockingQueue
http://www.iocoder.cn/JUC/sike/PriorityBlockingQueue/ 我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那...转载 2018-10-08 22:00:58 · 135 阅读 · 0 评论 -
深入分析 volatile 的实现原理
http://www.iocoder.cn/JUC/sike/volatile/通过前面一章,我们了解了 synchronized 是一个重量级的锁,虽然 JVM 对它做了很多优化。而下面介绍的 volatile ,则是轻量级的 synchronized ,它在多线程开发中保证了共享变量的“可见性”。如果一个变量使用 volatile ,则它比使用 synchronized 的成本更加低,因为...转载 2018-10-10 23:04:29 · 197 阅读 · 0 评论 -
深入分析 synchronized 的实现原理
http://www.iocoder.cn/JUC/sike/synchronized/记得刚刚开始学习 Java 的时候,一遇到多线程情况就是 synchronized ,相对于当时的我们来说 synchronized 是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道 synchronized 是一个重...转载 2018-10-10 23:03:22 · 464 阅读 · 0 评论 -
Java NIO 的前生今世 之四 NIO Selector 详解
https://segmentfault.com/a/1190000006824196SelectorSelector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一个线程中使用了多个 Channel, 因此也会造成了每个 Channel 传输效率的降低.使用 Selec...转载 2018-10-10 23:00:46 · 104 阅读 · 0 评论 -
springboot 之整合rabbitMq
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apache,当然了今天的主角还是讲RabbitMQ。消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在...转载 2018-10-16 22:09:29 · 150 阅读 · 0 评论 -
J.U.C 之 AQS:CLH 同步队列
http://www.iocoder.cn/JUC/sike/aqs-1-clh/1. 简介CLH 同步队列是一个 FIFO 双向队列,AQS 依赖它来完成同步状态的管理:当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程 当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。...转载 2018-10-09 22:00:39 · 244 阅读 · 0 评论 -
J.U.C 之 AQS:同步状态的获取与释放
http://www.iocoder.cn/JUC/sike/aqs-2/#在前面提到过,AQS 是构建 Java 同步组件的基础,我们期待它能够成为实现大部分同步需求的基础。AQS 的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态。对于子类而言,它并没有太多的活要做,AQS 已经提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步状态...转载 2018-10-09 21:58:30 · 264 阅读 · 0 评论 -
深入分析 CAS
1. 概述CAS ,Compare And Swap ,即比较并交换。Doug Lea 大神在实现同步组件时,大量使用CAS 技术,鬼斧神工地实现了Java 多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基 CAS 实现的,甚至 ConcurrentHashMap 在 JDK 1.8 的版本中,也调整为 CAS + synchronized 。可以说,CAS 是整个...转载 2018-10-09 21:46:59 · 163 阅读 · 0 评论 -
J.U.C 之 Condition
http://www.iocoder.cn/JUC/sike/Condition/在没有 Lock 之前,我们使用 synchronized 来控制同步,配合 Object 的 #wait()、#notify() 等一系列方法可以实现等待 / 通知模式。在 Java SE 5 后,Java 提供了 Lock 接口,相对于 synchronized 而言,Lock 提供了条件 Condition...转载 2018-10-09 21:40:30 · 150 阅读 · 0 评论 -
J.U.C 之重入锁:ReentrantLock
http://www.iocoder.cn/JUC/sike/ReentrantLock/1. 简介ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于 synchronized 的使用,但是 ReentrantLock 提供了比 synchronized 更强大、灵活的锁机制,可以减少死锁发生的概率。API 介绍如下:一个可重入的互斥锁定 Lock,它...转载 2018-10-09 21:38:20 · 194 阅读 · 0 评论 -
J.U.C 之阻塞队列:SynchronousQueue
http://www.iocoder.cn/JUC/sike/SynchronousQueue/ 作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操...转载 2018-10-08 22:03:09 · 123 阅读 · 0 评论 -
J.U.C 之阻塞队列:DelayQueue
http://www.iocoder.cn/JUC/sike/DelayQueue/DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:缓存:清掉缓存中超时的缓存...转载 2018-10-08 22:01:54 · 132 阅读 · 0 评论 -
jvm系列(九):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演。 什么是 Java GCJava GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说...转载 2018-10-17 21:58:57 · 157 阅读 · 0 评论 -
深入理解线程通信
前言开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。可以通过以下几种方式实现:等待通知机制等待通知模式是 Java 中比较经典的线程通信方式。两个线程通过对同一对象调用等待 wait() 和通知 notify() 方法来进行通讯。如两个线程交替打印奇偶数:public class Tw...转载 2018-09-27 22:35:52 · 129 阅读 · 0 评论 -
java Daemon (守护)线程理解
Daemon 线程是一种支持性线程,例如:web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。因此它的主要作用是作为程序后台调度及支持性服务类工作,这也意味着当java虚拟机中不存在非Damemon线程时,java虚拟机将会退出,Daemon线程失去了服务对象也原创 2017-12-08 00:18:53 · 540 阅读 · 0 评论 -
Java SE1.6中的Synchronized
1 引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义术语英文说明转载 2017-12-06 22:46:17 · 195 阅读 · 0 评论 -
深入分析Volatile的实现原理
引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分转载 2017-12-06 22:43:47 · 147 阅读 · 0 评论 -
生产者消费者模式
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。为什么要使用生产者和消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那转载 2017-12-05 23:14:59 · 201 阅读 · 0 评论 -
JAVA CAS原理深度分析
v参考文档:http://www.blogjava.net/xylz/archive/2010/07/04/325206.htmlhttp://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.htmlhttp://www.searchsoa.com.cn/showcontent_69238.htmht转载 2017-12-04 23:57:53 · 180 阅读 · 0 评论 -
Java并发编程:线程池的使用(非常棒,通俗易懂)
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池转载 2017-11-29 12:56:14 · 387 阅读 · 0 评论 -
Java并发编程:线程封闭和ThreadLocal详解
什么是线程封闭当访问共享变量时,往往需要加锁来保证数据同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程中访问数据,就不需要同步了。这种技术称为线程封闭。在Java语言中,提供了一些类库和机制来维护线程的封闭性,例如局部变量和ThreadLocal类,本文主要深入讲解如何使用ThreadLocal类来保证线程封闭。理解ThreadLocal类ThreadLocal类能使线程中的转载 2017-11-14 20:23:22 · 248 阅读 · 0 评论 -
线程堵塞概念
所谓的阻塞,就是线程能够运行,但是某个条件阻止它的运行,当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间,直到线程重新进入就绪状态,它才有可能执行操作。就绪并代表是在运行啊,所谓的就绪,就是可运行也可不运行,只要调度器分配时间片给线程,线程就可以运行,因为我们都知道,调度器是如何分配线程,是不确定的。为什么任务会进入阻塞的状态,一般有以下几个原因: 1.通转载 2017-11-14 20:10:36 · 960 阅读 · 0 评论 -
40个Java多线程问题总结
1、多线程有什么用?一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法:(1)发挥多核CPU的优势随着工业的进步,现在的笔记本、台式机乃至商用的应转载 2017-11-17 15:56:32 · 225 阅读 · 0 评论 -
wait,notify,synchronized实现阻塞队列
import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class MyQueue { //1 需要一个承装元素的集合 private LinkedList list = new LinkedLi原创 2017-11-10 22:12:26 · 1083 阅读 · 3 评论 -
wait ,notfiy 配合synchronized关键字使用,wait立即释放锁,而notify并不立即释放
wait ,notfiy 配合synchronized关键字使用,wait立即释放锁,而notify并不立即释放,如果想实现立即通知可以使用concurrent包CountDownLatch类await方法与countDown方法实现立即通知。原创 2017-11-10 21:41:01 · 911 阅读 · 0 评论 -
如何优雅的使用和理解线程池
前言平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 Java 手册》里也有一条:可见线程池的重要性。简单来说使用线程池有以下几个目的: 线程是稀缺资源,不能频繁的创建。 解耦作用;线程的创建于执行完全分开,方便维护。 应当将其放入一个池子中,可以给其他任务进行复用。 线程池原理谈到线程池就会想到池化技术,其中最核心的思想...转载 2018-08-23 22:55:18 · 133 阅读 · 0 评论 -
常访问的源码链接收藏
bosshttp://www.iocoder.cn/#mybatishttp://www.iocoder.cn/MyBatis/good-collection/RabbitMQ 实现原理与源码解析系统http://www.iocoder.cn/RabbitMQ/good-collection/springhttp://www.iocoder.cn/Spring/good...原创 2018-09-13 00:08:22 · 220 阅读 · 0 评论