
并发编程专题
文章平均质量分 82
源码小哥
这个作者很懒,什么都没留下…
展开
-
Java.util.ConcurrentModificationException异常产生及解决办法
同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,遍历容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这个复合操作在多线程并发地修改容器的时候,可能表现出意外的行为,最为经典的便是ConcurrentModifationException,原因是当容器迭代的过程中,被并发地修改了容器的内容,这是由于在早起迭代器设计的时候并没有考虑并发修改的问题。原创 2022-05-13 16:00:12 · 15790 阅读 · 0 评论 -
为什么双重检查锁模式需要volatile?
文章目录1.双重检查锁定2.错误的延迟初始化例子3.new 实例背后的指令4.volatile作用5.使用局部变量优化性能6.总结1.双重检查锁定双重检查锁定(Double check locked)模式经常会出现在一些框架源码中,目的是为了延迟初始化变量。这个模式还可以用来创建单例。下面来看一个 Spring 中双重检查锁定的例子。这个例子中需要将配置文件加载到 handlerMappings中,由于读取资源比较耗时,所以将动作放到真正需要 handlerMappings 的时候。我们可以看到 h原创 2021-04-30 12:49:54 · 761 阅读 · 0 评论 -
Java中的双重检查锁定
Java中的Singleton模式是一种创新模式。 随着时间的流逝,人们开始关注Singleton模式的使用和实现。 这是由于单例的实现和使用方式存在一些非常根本的问题所致。Java中的单例模式具有多种功能,例如:确保只有一个类实例存在于JVM中。提供对类实例的全局访问。防止直接创建类实例的私有构造函数。最适合用于日志记录,线程池,缓存等…使用Java创建Singleton模式的三种基本方法。 我将列出所有这些内容,并告诉您单例模式是如何随着时间演变的,以及为什么双重检查锁定是当前最好的方法。原创 2020-12-10 23:41:29 · 361 阅读 · 1 评论 -
Volatile使用详解
1.概述volatile是Java提供的轻量级的同步机制,保证了可见性,不保证原子性。了解volatile工作机制,首先要对Java内存模型(JMM)有初步的认识:每个线程创建时,JVM会为其创建一份私有的工作内存(栈空间),不同线程的工作内存之间不能直接互相访问。JMM规定所有的变量都存在主内存,主内存是共享内存区域,所有线程都可以访问线程对变量进行读写,会从主内存拷贝一份副本到自己的工作内存,操作完毕后刷新到主内存。所以,线程间的通信要通过主内存来实现。volatile的作用是:线程对副本变原创 2020-12-10 23:22:48 · 1250 阅读 · 0 评论 -
多线程专题-生产者消费者问题
等待唤醒机制其实就是经典的“生产者与消费者”的问题。就拿生产包子消费包子来说等待唤醒机制如何有效利用资源:包子铺线程生产包子,吃货线程消费包子。当包子没有时(包子状态为false),吃货线程等待,包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态),因为已经有包子了,那么包子铺线程进入等待状态。接下来,吃货线程能否进一步执行则取决于锁的获取情况。如果吃货获取到锁,那么就执行吃包子动作,包子吃完(包子状态为false),并通知包子铺线程(解除包子铺的等待状态),吃货线程进入等待原创 2020-05-27 23:53:44 · 311 阅读 · 2 评论 -
并发编程-ThreadLocal
1.引言变量值的共享可以使用public static变量的形式,所有的线程都使用同一个public static变量。如果想实现每一个线程都有自己的共享变量,就需要使用JDK中提供的ThreadLocal类。ThreadLocal类主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。2.方法get()与null示...原创 2020-02-24 17:42:39 · 235 阅读 · 0 评论 -
并发编程-线程间通讯-下
1.通过管道进行线程间通信:字节流在Java语言中提供了各种各样的输入/输出流Stream,使我们能够很方便地对数据进行操作,其中管道流pipeStream是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无需借助于类似临时文件之类的东西。在Java的JDK中提供了4个类来使线程间可以互相通信:(1)...原创 2020-02-24 11:48:57 · 229 阅读 · 0 评论 -
并发编程-线程间通讯-上
1.引言线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体。线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效地把控与监督。2.等待/通知机制(wait/notify)2.1.不使用等待/通知机制实现线程间通信示例:线程A向数组中增加元素,线程B不...原创 2020-02-23 21:59:54 · 1175 阅读 · 0 评论 -
并发编程-多线程三大特性
工作中许多地方需要涉及到多线程的设计与开发,java多线程开发当中我们为了线程安全所做的任何操作其实都是围绕多线程的三个特性:原子性、可见性、有序性展开的。1.原子性原子性是指一个操作或者一系列操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。其实这句话就是在告诉你,如果有多个线程执行相同一段代码时,而你又能够预见到这多个线程相互之间会影响对方的执行结果,那么这段代码是不满足原...原创 2020-02-21 22:03:25 · 904 阅读 · 0 评论 -
《我要进大厂系列 六》-谈谈你对ThreadLocal理解
1.ThreadLocal是什么ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。2.从数据结构入手下图为ThreadLocal的内部结构图ThreadLocal结构内部从上面的结构图,我们已经窥见ThreadLoca...原创 2020-02-21 17:38:21 · 211 阅读 · 0 评论 -
并发编程-多线程线程安全
1.为什么有线程安全问题当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。/** * @Auther: bruceliu * @Classname ThreadTrain * @Date: 2020/2/21 16:...原创 2020-02-21 17:14:05 · 235 阅读 · 0 评论 -
并发编程-多线程基础
1.引言推荐书籍深入理解Java并发编程Java并发编程核心知识点多线程基础知识同步和异步的概念线程安全(线程同步)相关线程通讯java1.8并发包线程池原理分析锁的概念专题类学习并发编程性能优化源码分析高并发与高可用分布式缓存分布式协调工具分布式常用解决方案互联网安全体系架构互联网工具java内存模型 堆和栈? 线程可见性1.计算机发展历史...原创 2020-02-21 14:33:51 · 328 阅读 · 0 评论 -
并发编程专题(四)-线程的控制
1.Join方法Thread提供了让一个线程等待另一个线程完成的方法join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的join线程执行完为止。join()方法通常由使用线程的程序调用,以将大问题划分成许多小问题,每个小问题分配一个线程。当所有的小问题都得到处理后,再调用主线程来进一步操作。例如当在主线程当中执行到t1.join(...原创 2019-06-01 23:55:04 · 218 阅读 · 2 评论 -
并发编程专题(二)-线程的创建方式
1. 通过继承Thread类来创建并启动多线程的方式2. 通过实现Runnable接口来创建并启动线程的方式3. 通过实现Callable接口来创建并启动线程的方式4. 总结Java中创建线程的方式,比较各自优势和区别原创 2019-06-01 17:55:16 · 198 阅读 · 0 评论 -
并发编程专题(三)-线程的状态
6.Thread类我们已经可以完成最基本的线程开启,那么在我们完成操作过程中用到了 java.lang.Thread 类,API中该类中定义了有关线程的一些方法,具体如下:构造方法:public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target)...原创 2019-05-30 18:02:44 · 274 阅读 · 0 评论 -
并发编程专题(一)-并发与多线程
1. 并发与并行的区别,何为并发编程,并发编程的优势在哪2. 多线程、多任务、多进程机制概述3. 多线程、多任务、多进程机制与编程思想的关系原创 2019-05-30 17:48:48 · 522 阅读 · 0 评论 -
并发编程进阶03-java.util.ConcurrentModificationException异常-多线程情况
同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,遍历容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这个复合操作在多线程并发地修改容器的时候,可能表现出意外的行为,最为经典的便是ConcurrentModifationException,原因是当容器迭代的过程中,被并发地修改了容器的内容,这是由于在早起迭代...原创 2019-03-10 16:27:47 · 634 阅读 · 0 评论 -
并发编程进阶02-java.util.ConcurrentModificationException异常-单线程情况
同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,遍历容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这个复合操作在多线程并发地修改容器的时候,可能表现出意外的行为,最为经典的便是ConcurrentModifationException,原因是当容器迭代的过程中,被并发地修改了容器的内容,这是由于在早起迭代...原创 2019-03-10 15:53:15 · 328 阅读 · 0 评论 -
并发编程进阶01-同步类容器
同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,遍历容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这个复合操作在多线程并发地修改容器的时候,可能表现出意外的行为,最为经典的便是ConcurrentModifationException,原因是当容器迭代的过程中,被并发地修改了容器的内容,这是由于在早起迭代...原创 2019-03-10 13:30:20 · 256 阅读 · 0 评论 -
并发编程基础08-线程安全单例
单例模式:最为常见的就是饿汉式和懒汉式。一个是直接实例化对象,一个是在调用的时候实例化对象。在多线程的模式中,往往要考虑到性能和线程安全的问题,我们一般选择两种比较经典的单例模式,在性能提高的同事,又能保证线程的安全。静态内部类方式:public class Singletion { private static class InnerSingletion { private s...原创 2019-03-10 11:18:24 · 224 阅读 · 0 评论 -
并发编程基础08-ThreadLocal线程局部变量
ThreadLocal概念:线程局部变量。是一种多线程间并发访问某一个变量的解决方案。与Synchronized等加锁的方式有所不同,ThreadLocal完全不提供锁。而是使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程的安全。 从性能上来说,ThreadLocal不具有绝对的优势,在并发不是很高的情况下,加锁的性能会更好,但是作为一套与锁完全无关的线程安全解决方案,在高...原创 2019-03-10 11:11:54 · 218 阅读 · 0 评论 -
并发编程基础07-使用wait和notify模拟LinkedBlockingQueue
BlockingQueue:顾名思义,首先它是一个队列,然后支持阻塞机制。阻塞的放入和得到的数据。如果我们要实现LinkedBlockingQueue,那么最起码要实现两个最为基础的方法:put和tack。put:把anObject加入到BlockingQueue中,如果队列中没有空间,则调用此方法的线程被阻塞,直到BlockingQueue中有可用的空间再继续加入。tabk:获取Block...原创 2019-03-10 10:56:33 · 424 阅读 · 0 评论 -
并发编程基础06-单例模式
1.饿汉式单例示例:/** * 单例模式1:饿汉式 * @author bruceliu * @create 2019-02-28 11:27 */public class MySingeleton { private static MySingeleton instance=new MySingeleton(); public MySingeleton(){...转载 2019-02-28 23:26:19 · 269 阅读 · 0 评论 -
并发编程基础04-volatile关键字
1.volatile 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.volatile关键字的主要作用是使变量在多个线程间可见。示例1:/** * @author bruceliu * @create 2019-02-27 20:25 */public c...原创 2019-02-27 23:35:45 · 284 阅读 · 0 评论 -
并发编程基础05-线程通信
1.线程之间的通信 线程通信的概念:线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能形成一个整体,那么线程之间的通信就成为整体的比用方式之一。系统中的线程存在通信,那么系统间的交互性就会更大,在提高CPU利用率的同时还会使得开发人员更好的把控线程任务的调用、更加便捷的对线程的处理过程进行监督。 使用wait/notify方法实现线程间的通信(注意这两个方法都是object类...原创 2019-02-27 23:20:28 · 222 阅读 · 0 评论 -
并发编程基础03-Synchronized关键字
1.Synchronized锁重入关键字synchronized拥有锁重入额功能,也就是说在使用synchronized关键字的时候,当一个线程得到一个锁的对象后,再次请求此对象时是课再次得到该对象的锁。如果说在执行锁内容的过程中出现了异常的话,那么锁将会被自动释放。示例1/** * synchronized的重入 * * @author bruceliu * @create 201...原创 2019-02-26 23:43:57 · 203 阅读 · 0 评论 -
并发编程基础02-同步和异步
1.对象锁的同步和异步同步:synchronized同步的概念就是共享,我们只需要牢牢把握“共享”这个两个字就可以,如果不是共享的资源,就没有必要进行同步的操作。异步:asynchronized异步的概念就是独立,相互之间不受到相互的影响和制约。就好像我们在学习http的时候,在页面上发起一个Ajax请求,我们还可以继续浏览或者操作页面的内容,二者之间没有任何关系。同步的目的就是为了线程...原创 2019-02-26 20:38:56 · 353 阅读 · 0 评论 -
并发编程基础01-线程安全
1.线程安全 线程安全的概念:当多个线程访问某一个类(对象或者方法)的时候,这个类始终都能表现出正确的行为,那么这个类(对象或者方法)及时线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码成为“互斥区”或者“临界区”。示例:/** * @author bruceliu * @create 2019-02-25 21:02 * 线程安全概念:当...原创 2019-02-25 21:32:49 · 264 阅读 · 0 评论