![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程
文章平均质量分 87
你好龙卷风!!!
如你所愿
展开
-
java多线13: disruptor框架
Disruptor系列(一)— disruptor介绍本文翻译自Disruptor在github上的wiki文章Introduction,原文可以看这里。### 一.前言作为程序猿大多数都有对技术的执着,想在这个方面有所提升。对于优秀的事物保持积极学习的心态,并发编程是开发中一大难题,无论是底层的各种理论还是上层的各种关于并发组件的实现,都非常的晦涩难懂。并发之所以难,就是因为"多"而难以控制。大多数都会使用"锁"这种技术进行控制,但是"锁"这种技术往往和性能又是背道而驰。为了能够将性能最转载 2021-02-13 23:18:34 · 461 阅读 · 0 评论 -
JMH使用说明
概述JMH,即Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。maven依赖 <!-- JMH --> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <.转载 2021-02-13 20:52:30 · 196 阅读 · 0 评论 -
java多线程12:阻塞队列Queue
本篇主要内容如下:本篇主要内容帮你总结好的阻塞队列: 18种Queue总结一、Queue自我介绍 队列原理图1.1 Queue自我介绍hi,大家好,我的英文名叫Queue,中文名叫队列,无论现实生活中还是计算机的世界中,我都是一个很重要的角色哦~我是一种数据结构,大家可以把我想象成一个数组,元素从我的一头进入、从另外一头出去,称为FIFO原则(先进先出原则)。我还有两个亲兄弟:List(列表)、Set(集),他们都是Collection的儿子,我还有一个远房亲戚:Ma转载 2021-02-13 19:03:57 · 451 阅读 · 0 评论 -
java多线程11: 异步线程池 CompletableFuture
引子为了让程序更加高效,让CPU最大效率的工作,我们会采用异步编程。首先想到的是开启一个新的线程去做某项工作。再进一步,为了让新线程可以返回一个值,告诉主线程事情做完了,于是乎Future粉墨登场。然而Future提供的方式是主线程主动问询新线程,要是有个回调函数就爽了。所以,为了满足Future的某些遗憾,强大的CompletableFuture随着Java8一起来了。Future传统多线程的却让程序更加高效,毕竟是异步,可以让CPU充分工作,但这仅限于新开的线程无需你的主线程再费心了。比如你原创 2021-01-28 11:52:38 · 673 阅读 · 0 评论 -
java多线程10:自定义线程池ThreadPoolExecutor
引言:在阿里新版619java开发手册有一段这样的话1. 【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。2. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。3. 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这原创 2021-01-28 11:38:10 · 566 阅读 · 0 评论 -
java多线程之 几种线程安全的list synchronizedList()&CopyOnWriteArrayList
并发下的ArrayList那么它究竟会出现什么问题呢?我们写一段简单的代码看一下:这段代码中,我们创建了两个线程,同时对ArrayList添加10000个元素,如果我们运行这段代码,我们肯定期望它返回的是20000。可是我在JDK1.8环境中运行这段代码,多次验证,会出现两种结果:import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;public class T02_CopyOnWriteList { .原创 2021-01-25 09:40:02 · 7882 阅读 · 0 评论 -
java while和if的区别 用多线程来展示 两者的区别
while用于循环语句,而if用于判断和分支语句。由于你并没有指明是什么程序,只能泛泛而谈了。if 语句中,常用格式为:if(判断条件){执行语句}上面的结构,只是进行一次判断。if与else结合,就可形成一个分支结构的语句,形如if(判断条件1){执行语句1}else if (判断条件2){执行语句2}else if (判断条件3){执行语句3}else if (...) {...}else{执行语句n}有些程序则用的是case,实际上与上面的else if等价。While一般有两原创 2021-01-17 12:47:11 · 476 阅读 · 3 评论 -
java多线程九: 同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)
线程同步辅助类,主要学习两点:1、上述几种同步辅助类的作用以及常用的方法2、适用场景,如果有适当的场景可以用到,那无疑是最好的semaphore(seməˌfôr)含义信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量)。举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着。如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待。每出来一个人就把钥匙放回原处以方便别人再次进入。常用方法acqu转载 2021-01-14 23:15:25 · 179 阅读 · 0 评论 -
java多线程八:ReentrantLock原理
ReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似。CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是由sun.misc.Unsafe这个类通过JNI调用CPU底层指令实现ReentrantLock主要利用CAS+AQS队列来实现。它支持公平转载 2021-01-11 21:52:46 · 136 阅读 · 1 评论 -
java 多线程七:LongAdder原理
前面介绍了Java中的一些原子类,但是基本都是通过CAS来实现原子性操作,白白浪费CPU资源。JDK8中新增了一个原子性递增或者递减类LongAdder用来克服高并发下使用AtomicLong的缺点。LongAdder的思路是把一个变量分解为多个变量,让同样多的线程去竞争多个资源。如图所示:使用LongAdder时,内部维护了多个Cell变量,每个Cell里面有一个初始值为0的long型变量,这样同时争取一个变量的线程就变少了,而是分散成对多个变量的竞争,减少了失败次数。如果竞争某个Cell变量失败,它不转载 2021-01-10 21:57:58 · 167 阅读 · 0 评论 -
java多线程六:原子操作类Atomic
由于Java中变量会有多种类型,所以Atomic包中提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。其实实现原理都是对Unsafe类中一些方法的包装。1. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了一下3个类。AtomicBoolean:原子更新布尔类型。 AtomicInteger:原子更新整形 AtomicLong:原子更新长整型。当然这3个类提供的方法几乎一模一样,所以就只说一下AtomicI转载 2021-01-10 21:48:38 · 120 阅读 · 0 评论 -
Java多线程五:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了vol...转载 2021-01-10 13:52:16 · 144 阅读 · 0 评论 -
java 多线程四:CAS机制与自旋锁
CAS(Compare-and-Swap),即比较并替换,java并发包中许多Atomic的类的底层原理都是CAS。它的功能是判断内存中某个地址的值是否为预期值,如果是就改变成新值,整个过程具有原子性。具体体现于sun.misc.Unsafe类中的native方法,调用这些native方法,JVM会帮我们实现汇编指令,这些指令是CPU的原子指令,因此具有原子性。 public class CASDemo { public static void main(String[] a转载 2021-01-09 23:21:00 · 480 阅读 · 0 评论 -
java多线程三:Synchronized详解
目录一、Synchronized使用场景二、Synchronized实现原理三、锁的优化1、锁升级2、锁粗化3、锁消除一、Synchronized使用场景Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二是多线程同时访问并改变该数据。例如:public class AccountingSync im.转载 2021-01-09 22:58:37 · 493 阅读 · 0 评论 -
java 多线程二:线程相关的6种基本方法 及6种状态
java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式。线程的状态图java将操作系统中的就绪和运行两种状态统称为可运行状态,java中线程的状态可以认为有以上六种。wait调用该方法的线程进入WAITING状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁。因此,wait方法一般用在同步方法或同步代原创 2021-01-09 16:32:24 · 119 阅读 · 0 评论 -
java 多线程一:什么是线程安全,怎样保证线程安全
什么是线程安全,怎样保证线程安全 多线程编程中的三个核心概念 原子性 这一点,跟数据库事务的原子性概念差不多,即一个操作(有可能包含有多个子操作)要么全部执行(生效), 要么全部都不执行(都不生效)。 关于原子性,一个非常经典的例子就是银行转账问题:比如A和B同时向C转账10万元。 如果转账操作不具有原子性,A在向C转账时,读取了C的余额为20万,然后加上转账的10万,计算出此时应该...转载 2020-12-01 09:46:42 · 341 阅读 · 0 评论 -
多线程之 几种线程安全的Map及效率比较
Java中平时用的最多的map就是hashmap但是它却是线程不安全的。那除了hashmap还有哪些常见的线程安全的map?1.hashtableMap<String,Object> hashtable=new Hashtable<String,Object>();这是所有人最先想到的,那为什么它是线程安全的?那就看看它的源码,我们可以看出我们常用的put,get,containsKey等方法都是同步的,所以它是线程安全的public synchronized bool原创 2020-05-27 17:13:02 · 8073 阅读 · 0 评论 -
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingle
转自:https://www.cnblogs.com/baizhanshi/p/5469948.html1、new Thread的弊端执行一个异步任务你还只是如下new Thread吗?Java 1 2 3 4 5 6 7 new Thread(new Runnable() { ...转载 2018-10-12 16:31:27 · 1765 阅读 · 0 评论 -
Java多线程之-LinkedBlockingDeque
转:https://blog.csdn.net/u010923921/article/details/77488043LinkedBlockingDeque介绍LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);并且,该阻塞队列是支持线程安全。此外,LinkedBlo...转载 2018-08-08 11:21:06 · 339 阅读 · 0 评论