JUC多线程
文章平均质量分 88
Java5.0添加了一个新的java.util.concurrent开发包(简称JUC),目的就是为了更好的支持高并发任务,让开发者利用这个包进行的多线程编程时可以有效的减少竞争条件(race conditions)和死锁线程。
Jeremy_Lee123
AI Everywhere!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux服务器之CPU过高解决思路
CPU负载过高,定位思路如下:1. 先用top命令找出CPU占比最高的2. ps -ef 或者jps进一步定位,得知是一个怎样的一个后台程序给我们惹事3. 定位到具体线程或代码4. 将需要的线程ID转换为16进制格式(英文小写格式)5. jstack 进程ID | grep tid(16进程线程ID小写英文) -A601. 先用top命令找出CPU占比最高的to...原创 2019-07-29 23:40:58 · 3568 阅读 · 0 评论 -
Java技术之AQS详解
AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其他方法执行所有的排队和阻塞机制。子类...原创 2020-01-06 13:49:25 · 872 阅读 · 1 评论 -
sun.misc.Unsafe类详解
一、Unsafe类的作用可以用来在任意内存地址位置处读写数据(可见,对于普通用户来说,使用起来还是比较危险的); 支持一些CAS原子操作;二、获取Unsafe对象以下sun.misc.Unsafe源码和demo基于jdk1.8;遗憾的是,Unsafe对象不能直接通过new Unsafe()或调用Unsafe.getUnsafe()获取,原因如下:不能直接new Unsafe...原创 2020-01-06 13:31:35 · 1483 阅读 · 0 评论 -
Eclipse导入sun.misc.Unsafe类及其源码
一、Eclipse导入sun.misc.Unsafe类报错的解决方法在eclipse中导入sun.misc.Unsafe类后,错误如图所示:错误很明显,提示找不到这个类。具体解决方案如下:点击Windows-Preferences-Java-Installed JREs,选择右边默认的JRE,点击Edit,在弹出的界面中,更改JRE home为JDK目录下面的那个JRE。具体如图...原创 2020-01-06 11:09:43 · 2431 阅读 · 0 评论 -
Java8新特性之parallelStream详解
一、什么是流?Stream是java8中新增加的一个特性,首先Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母...原创 2019-12-30 23:51:07 · 4328 阅读 · 0 评论 -
JUC多线程及并发之Volatile关键字
一、volatile关键字作用volatile是Java虚拟机提供的轻量级的同步机制1.1.保证可见性各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存操作后再写回主内存中的.这就可能存在一个线程AAA修改了共享变量X的值还未写回主内存中时 ,另外一个线程BBB又对内存中的一个共享变量X进行操作,但此时A线程工作内存中的共享比那里X对线程B来说并不不可见.这种工作...原创 2019-06-22 23:42:54 · 848 阅读 · 0 评论 -
CAS技术之底层原理
一、什么是CASCAS的全称为Compare-And-Swap ,它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的。CAS并发原语提现在Java语言中就是sun.miscUnSafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我实现CAS汇编指令.这是一种完全依赖于硬件 功能,通过它实现了原子操作。再次强调,由于CA...原创 2019-06-30 14:55:54 · 15613 阅读 · 3 评论 -
轻量级RPC框架开发
一、RPC原理学习1.1.什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在...原创 2019-06-23 20:43:34 · 906 阅读 · 0 评论 -
nio原理之netty常用API详解
一、nio简介 nio 是New IO 的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下:1、为所有的原始类型提供(Buffer)缓存支持。2、字符集编码解码解决方案。 Channel :一个新的原始I/O 抽象。 3、支持锁和内存映射文件的文件访问接口。4、提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。1....原创 2019-06-23 22:13:19 · 4442 阅读 · 3 评论 -
CompletableFuture组合异步编程详解
CompletableFuture 组合式异步编程本节内容:创建异步计算并获取计算结果.使用非阻塞操作提升吞吐量.设计和实现异步API.如何以异步的方式使用同步的API.如何对两个或多个异步操作进行流水线和合并操作.如何处理异步操作的完成状态.现在,很少有网站或者网络应用会以完全隔离的方式工作。更多的时候,我们看到 的下一代网络应用都采用“混聚...原创 2019-07-24 00:33:27 · 1506 阅读 · 0 评论 -
集合类不安全之HashMap类
一、HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap 的实例...原创 2019-07-01 23:52:06 · 834 阅读 · 0 评论 -
集合类不安全之Set类
一、概括定义:一个set集合不能包含重复的元素,set实现Collection并增加了hashCode和equals方法。set不允许存储值相同的元素,原因为在取值的时候set依靠的是元素本身取值。由于set提供了hashCode和Equals方法,所以set支持比较。set主要实现HashSet,TreeSet,LinkedHashSet(后面会分别以不同的文章介绍着三种实现)set...原创 2019-07-01 23:15:24 · 1301 阅读 · 0 评论 -
集合类不安全之ArrayList类
一、概括:1、ArrayList 底层基于数组实现容量大小动态可变。 扩容机制为首先扩容为原始容量的 1.5 倍。如果1.5倍太小的话,则将我们所需的容量大小赋值给 newCapacity,如果1.5倍太大或者我们需要的容量太大,那就直接拿newCapacity = (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARR...原创 2019-07-01 23:02:32 · 771 阅读 · 0 评论 -
java中的15种锁介绍
概括1、公平锁/非公平锁2、可重入锁/不可重入锁3、悲观锁/乐观锁4、自旋锁5、分段锁6、互斥锁/读写锁7、独享锁/共享锁8、偏向锁/轻量级锁/重量级锁以上锁分类并不全指锁的状态,有些是锁的特性、设计。公平锁:按线程申请锁的先后顺序获得锁非公平锁:线程不是按先后顺序获得锁,效率比公平锁效率高可重入锁:已获得的锁在内层可重复使用不可重入锁:已获得的锁在内层不可重复使用悲观...原创 2019-07-02 00:37:43 · 793 阅读 · 0 评论 -
java-15种锁之公平锁和非公平锁
1、什么是公平锁和非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似与排队打饭,先来后到。非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象。2、公平锁和非公平锁举例public class FairAndUnfairLock {Lock lock =...原创 2019-07-02 00:45:11 · 1067 阅读 · 0 评论 -
java-15种锁之自旋锁
1、Java自旋锁理论自旋锁(spinlock):是指尝试去获取锁的线程不会立即阻塞,而是采用循环的方式去获取锁,这样的好处是减少线程上下文切换消耗,缺点是循环会消耗CPU。 (等待的时候还可以去处理其他任务)public final int getAndAddInt(Object var1, long var2, int var4) {int var5;...原创 2019-07-02 00:56:00 · 1181 阅读 · 0 评论 -
java-15种锁之可重入锁(又名递归锁)
1、什么是可重入锁(递归锁) 可重入锁(也叫递归锁):指的是同一线程外层函数获得锁之后,内层递归函数仍然可以获取该锁的代码,在同一线程在外层方法获取锁的时候+,在进入内层方法会自动获取锁。也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。2、可重入锁(递归锁)举例进入method1方法跟进入method2方法获取的是同一把锁public s...原创 2019-07-02 00:55:43 · 1799 阅读 · 0 评论 -
java-15种锁之独占锁(写)/共享锁(读)/互斥锁
1、Java读写锁理论写锁(独占锁):是指该锁一次只能被一个线程锁持有。对ReentrantLock和Sychronized而言都是独占锁。读锁(共享锁):是指该锁可被多个线程持有。对ReentrantReadWriteLock而言,其读锁是共享锁,其写锁是独占锁。读锁的共享性可保证并发读是非常高效的,读写、写读、写写的过程都是互斥的。2、Java读写锁代码验证Demo One:代...原创 2019-07-02 01:00:58 · 3454 阅读 · 0 评论 -
java-锁的应用之CountDownLatch/CyclicBarrier/Semaphore
概括:CountDownLatch:(英[lætʃ]门闩; 插销; )让一些线程阻塞直到另外一些完成后才被唤醒。CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞.其他线程调用countDown方法计数器减1(调用countDown方法时线程不会阻塞),当计数器的值变为0,因调用await方法被阻塞的线程会被唤醒,继续执行(秦灭六国) Cyc...原创 2019-07-02 01:21:55 · 901 阅读 · 0 评论 -
阻塞队列之BlockingQueue详解
一、阻塞队列是什么?定义:阻塞队列首先是一个队列,当队列是空的时候,从队列获取元素的操作将会被阻塞,当队列是满的时候,从队列插入元素的操作将会被阻塞。消息中间件底层用的就是阻塞队列。二、阻塞队列好处 在多线程领域,所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。为什么需要使用BlockingQue...原创 2019-07-02 07:28:51 · 2555 阅读 · 0 评论 -
java-锁的应用之绑定多个条件Condition
一、synchronized和Lock区别(1)原始构成sychronized是关键字属于JVM层面的, monitorenter、monitorexit(底层是通过monitor对象来完成的,其实wait/notify方法也依赖于monitor对象,只有在同步块或者同步方法中才能调用wait/notify等方法); Lock属于具体类(java.util.concurrent.loc...原创 2019-07-02 07:44:54 · 3414 阅读 · 5 评论 -
阻塞队列应用之生产者消费者模式
一、传统版package com.lxk.lock;public class OldSync { public static void main(String[] args) { final Object object = new Object(); Thread t1 = new Thread() { public void run() { synchron...原创 2019-07-02 22:47:31 · 871 阅读 · 0 评论 -
阻塞队列应用之线程池
一、为什么使用线程池1.1、线程池的概念线程池做的主要工作就是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果运行线程数量超出了最大线程数量,超出部分需要排队等候,等待其他线程执行完毕,然后线程再从队列中取出任务执行。1.2、线程池的主要特点线程复用; 控制最大并发数; 管理线程;1.3、线程池的优势降低资源的消耗。通过重复利...原创 2019-07-02 23:16:42 · 1125 阅读 · 0 评论 -
三种创建线程方式之Callable接口
一、类继承关系及API解析Callable接口@FunctionalInterfacepublic interface Callable<V> { V call() throws Exception;}Callable接口中只有一个call()方法,和Runnable相比,该方法有返回值并允许抛出异常。但是这里有一个问题,进程是要通过Thread类去创建...原创 2019-07-03 00:01:20 · 1158 阅读 · 0 评论 -
线程池原理之七大参数和四种拒绝策略
一、说说线程池的底层工作原理线程池主要处理流程解释(重要)1、在创建了线程池后,等待提交过来的任务请求。2、当调用execute()方法添加一个任务请求,线程池会做如下判断:2.1 如果正在运行的线程数小于或者等于corePoolSize,那么马上会创建线程运行这个任务; 2.2 如果正在运行的线程数大于corePoolSize,那么会将这个任务放入队列; 2.3 如果这时...原创 2019-07-03 00:01:25 · 3065 阅读 · 0 评论 -
线程池应用之如何合理配置线程数
一、线程池如何配置合理线程数(1)CPU密集型: 定义:CPU密集型的意思就是该任务需要大量运算,而没有阻塞,CPU一直全速运行。CPU密集型任务只有在真正的多核CPU上才可能得到加速(通过多线程)。CPU密集型任务配置尽可能少的线程数。CPU密集型线程数配置公式:CPU核数+1个线程的线程池(2)IO密集型: ...原创 2019-07-03 00:10:16 · 8000 阅读 · 4 评论 -
死锁原因及定位分析
1、什么是死锁?死锁是指两个或者两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,那它们就无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很底,否则就会因为争夺有限资源而陷入死锁。2、死锁模型图3、手写死锁编码(一个线程有两把锁,同时启两个线程,使锁相互等待)package com.lxk.lock;/** ...原创 2019-07-03 00:25:44 · 1330 阅读 · 0 评论
分享