- 博客(21)
- 收藏
- 关注
原创 白话Java锁--synchronized关键字
在看了看Disruptor这个东西之后,感觉要是想要了解其中的原理还是需要了解一下java中的锁体系。说到锁第一个浮现在我脑海中的就是synchronized关键字,可能也是我在项目中常用的吧,因为比较方便。在现在大数据量时代下,如何提高系统的运行效率是现在大多数程序员所考虑的,大多数做法无非就是开启多线程或者异步请求调用,异步就不用了多说了(说白了就是将耗时的操作放在一个队列里面,然后再从队...
2019-07-22 17:47:42 1463
原创 白话JUC--Queue体系--ConcurrentLinkedQueue
首先看一下ConcurrentLinkedQueue继承关系从这里可以看到ConcurrentLinkedQueue没有实现BlockingQueue接口,所以是非阻塞的队列ConcurrentLinkedQueue简介ConcurrentLinkedQueue是基于链表的非阻塞无界队列,采用先进先出(FIFO)的规则对节点进行排序,使用CAS非阻塞算法来保证多线程下入队出队操作的线程安全...
2020-01-14 17:13:04 294
原创 白话JUC--Queue体系--LinkedBlockingQueue
首先看一下LinkedBlockingQueue继承关系LinkedBlockingQueue简介LinkedBlockingQueue是由链表实现的阻塞队列 static class Node<E> { E item; /** * One of: * - the real successor Node...
2020-01-04 19:43:51 213
原创 白话JUC--Queue体系--ArrayBlockingQueue
首先看一下ArrayBlockingQueue继承关系ArrayBlockingQueue简介ArrayBlockingQueue是java并发包下一个以数组实现的阻塞队列,它是线程安全的,特点是先进先出,又叫FIFOArrayBlockingQueue源码分析ArrayBlockingQueue主要成员变量 /** The queued items */ 存储元素的集合...
2019-12-30 22:22:12 211
原创 白话JUC--Queue体系
通过前几篇文章的研究,我们知道在JUC包中应用了大量的队列,所以详细了解队列将对我们后续研究并发编程乃至java编程拥有极高的价值Queue先从Queue接口开始说起吧public interface Queue<E> extends Collection<E>队列接口继承自Collection,说明也是集合类,与List和Set接口平级定义了队列的基本接口方...
2019-12-23 19:52:46 187
原创 白话JUC--executor框架--CompletionService
CompletionService 产生背景我们知道如果线程需要返回,可以使用Callable接口来实现具有返回值的线程。如果使用线程池技术的话,就需要将Callable任务submit给线程池,返回Future引用,然后利用Future引用的get方法获取整个线程池中的所有任务的运行结果。CompletionService运行原理CompletionService实际上可以看做是Execu...
2019-12-18 19:33:10 230
原创 白话JUC--executor框架--ThreadPoolExecutor
前文已经分析过了executor框架的大体结构,那么接下来就主要看一下executor框架中的主要实现类ThreadPoolExecutor中具体是如何实现线程池的ThreadPoolExecutor构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolS...
2019-12-10 21:02:59 131
原创 白话JUC--executor框架
通过前几篇文章了解了java基本的线程概念和锁的概念,我们就可以清楚的去了解java所提供的关于并发的包工具:java.util.concurrent,通过对java工具包的学习可以提供给我们项目中解决问题的思路或者项目中的并发问题。所以先从并发包的executor框架说起...
2019-12-05 18:24:56 184
原创 白话java锁--AQS--FairSync&NonfairSync、Condition、中断
上一篇文章分析了AQS的基本思想,此篇文章将对AQS中的其他方法,和其他高阶用法进行分析AQS–ReentrantLock–FairSync&NonfairSync上一篇文章只讲了ReentrantLock中的FairSync,也就是公平锁,没有分析NonfairSync,那么NonfairSync与FairSync有什么区别呢?FairSync&NonfairSync...
2019-10-15 20:03:52 357
原创 白话java锁--AQS--基本流程
从此篇文章起,接下来的文章将深入分析java.util.concurrent包中的内容由于java.util.concurrent包中的内容可能比较晦涩难懂,所以我将以我最通俗易懂的方式来讲解java.util.concurrent包中的内容基于前面几篇文章的基础,我们将从AQS这个东西开始说起。AQS在说AQS之前,我们先来了解一种设计模式,模板方法设计模式模板方法设计模式这种设...
2019-10-14 19:26:11 277 1
原创 白话java锁--线程状态--线程中断
前面介绍过了几种线程状态和几种状态之间的转换白话java锁–线程状态。此篇文章主要介绍的是对线程中断的理解。其实我一直不太理解为什么中断的时候线程会抛出个InterruptedException异常。线程中断API在以前的版本中使用stop()方法中断线程,但是该方法已经废弃了 @Deprecated public final void stop() { Sec...
2019-09-18 20:56:12 239
原创 白话java锁--饥饿与公平
在介绍简单自旋锁的时候,缺点中说简单自旋锁不能保证公平性,就会产生线程饥饿问题。那么到底什么是线程饥饿问题,什么又是公平性?线程饥饿如果一个线程的CPU执行时间片全部被其他线程抢走,而得不到CPU执行权,这个线程的状态就被称为饥饿。线程饥饿原因导致线程饥饿的原因:高优先级线程吞噬低优先级线程的CPU时间片线程一直等待获得锁而一直处于阻塞状态处于等待状态的线程,永远无法唤醒1.对...
2019-08-06 17:56:12 154
原创 白话java锁--自旋锁
自旋锁在多线程竞争下,执行同步代码的时候,通常会有两种方式解决同步问题:通过锁的方式将没有获得锁的线程阻塞没有获得锁的线程不进入阻塞,而是一直循环,看是否能够获得到锁所以为了解决并发下,线程进入阻塞,需要不断地从内核态和用户态进行转换,如果频繁的操作就会对系统的并发性有一定的影响,所以但是如果对共享资源的占用时间极短的话,比如只是增加或者减少,要不断的挂起、恢复线程的话,转换的时间可能...
2019-08-06 17:02:24 201
原创 白话java锁--线程状态
线程概念线程就是进程(进程就是在运行过程中的程序)的执行单元。过多内容不再赘述。这里注意一下java的线程是映射到操作系统的线程的,在执行线程操作的时候实际上是需要调用操作系统的方法的创建线程的四种方式方式一继承Thread类public class MyThread extends Thread注意:一个线程调用两次start()方法会抛出java.lang.IllegalTh...
2019-07-30 18:18:21 180
原创 白话Java锁--线程安全--无同步实现方案
此篇文章主要是为了介绍除了互斥同步、阻塞同步保证线程安全之外,还有无同步的方式实现线程安全,并且介绍一些相关的基础理论知识,方便我们后面对各种锁的理解。线程安全首先介绍一下,什么是线程安全。其实就是多个线程访问一个对象的时候,如果不考虑这些线程运行时环境的调度和交替运行,也不需要进行额外的同步,或者调用方法的任何其他协调操作,调用这个对象都可以获得正确的结果,那么这个对象就是线程安全的。对象...
2019-07-26 19:16:04 307
原创 白话Java锁--synchronized关键字--扩展Mutex和Semaphore
在研究synchronized原理的时候,重量锁会使用操作系统的Mutex机制,而且一些文章会提到信号量(Semaphore)这个东西。所以现在对这些概念简单的了解一下。信号量(Semaphore)信号量概述信号量主要是用来保护共享资源的,控制对共享资源的并发访问。当线程或进程获得信号量的时候,可以访问共享资源,操作完毕后释放信号量。当线程或进程获取不到信号量的时候,会将自身加入到一个等待队...
2019-07-24 19:54:22 1465
原创 白话CAS(比较与交换,Compare and swap)算法
在之前了解了volatile关键字后,就要讲到Java中是如何使用这个关键字的呢,就和网上大多数文章一样,volatile关键字最主要用在原子变量和原子引用上的使用。可能将说到原子变量(AtomicInteger)可能大多数的人在项目中还真就使用过,但是可能不理解其中的原理,其实很简单,原子变量和原子引用就包含两部分:一部分就是,volatile的可见性,在前两篇文章已经彻底的分析了一遍,另一部分...
2019-04-29 19:12:37 1635 2
原创 白话内存屏障(Memory Barrier)与volatile关键字
MESI所带来的问题上一节我们说到了MESI缓存一致性协议是如何实现的,实际上就是在进行写的时候只有一个能写,告诉别的核中的缓存都是过期的需要从最新的里面读;在读的时候大家可以一起读。虽然有了这个协议但是仔细分析一下会有这样一种情况的发生:首先有一个变量在多个核中的缓存存在,那么这个缓存的状态是S(shared)共享的,现在核A想要修改这个变量,首先核A会向所有拥有相同缓存的其他核发送一个请求...
2019-04-22 20:37:52 4346 7
原创 白话MESI缓存一致性协议
白话CPU MESI缓存一致性协议CPU缓存L1缓存/L2缓存/L3缓存cache line缓存条目(cache line)近一步可以分为三个部分:MSEI总结CPU缓存想要了解 CPU MESI缓存一致性协议 首先需要了解什么是CPU缓存。说CPU缓存之前,先了解一下CPU执行过程,但是CPU执行指令的过程非常复杂,这里我就直接简化为从内存中加载指令、执行指令、获取内存数据、将执行结果回写回...
2019-04-19 11:44:24 1470 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人