
Java多线程
Java语言的多线程编程
诗人不写诗
当你足够努力时,全世界都会给你让路
展开
-
ForkJoin是什么
Java 1.7开始,提供了fork join功能,他的作用是使用多线程分治任务,充分利用硬件资源进行计算。fork join和thread pool同时存在,他不是要替代thread pool,原创 2022-04-08 08:48:10 · 137 阅读 · 0 评论 -
Java守护线程
Java线程可以分为守护线程和非守护线程,守护线程是一种辅助线程,通常用来给非守护线程做一些准备或者收尾或者监控工作,当虚拟机中不存在非守护线程了,此时如果存在很多守护线程,虚拟机也会退出,也就是说守护线程不会阻碍虚拟机退出,当你开启一个守护线程,进行死循环时,如果没有非守护线程了,虚拟机也会退出。下面代码输出几行时间戳JVM就会退出,而将t.setDaemon(true)注释掉时,JVM就永远不会退出,因为此时有非守护线程一直的运行。public class DaemonExist {原创 2022-04-04 23:13:36 · 1280 阅读 · 0 评论 -
Java线程同步代码编写
Java中用于并发控制的方式比较多。主要有Lock和synchronized等。使用时需要能理解原理才行。原创 2022-04-02 22:17:27 · 595 阅读 · 0 评论 -
异步回调CompletableFuture
在Java8中,出现了可以异步执行并设置回调方法的功能,这对于需要处理耗时很久的任务的应用来说是一件令人振奋的消息。CompletableFuture不需要你实例化他,他有很多public static 方法直接调用,所以他本身就是一个工具类。一般来说,我们使用他就需要封装一下,形成自己的工具类,一方面可以更加简单,另一方面可以更加适合自身业务。...原创 2022-04-01 22:50:34 · 1185 阅读 · 0 评论 -
死锁发生的条件
1、互斥临界资源不允许同时访问,只能互斥访问。2、不可剥夺对已经占据临界资源的线程,不能由外界强制释放资源,只能等待任务结束。3、请求和保持相互作用的线程都是持有临界资源并请求另一临界资源。4、循环等待相互作用的线程之间请求和保持的...原创 2022-03-31 23:54:21 · 90 阅读 · 0 评论 -
Java线程的5种状态
java.lang.Thread.State线程共包括以下 5 种状态:1. 新建状态(New):线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。3. 运行状态(Running):线程获取CPU权限进行执行。需要注意的...原创 2022-03-30 23:55:10 · 1610 阅读 · 0 评论 -
1-自定义线程池
Java提供了丰富的线程池,但是通常我们需要定制自己的线程池,我们先来看看如何定制自己的线程池。原创 2020-12-01 23:32:15 · 1871 阅读 · 0 评论 -
2-JDK自带4种线程池
Java建议使用Executors方式使用线程池,Executors最终使用的是ThreadPoolExecutor来实现各种线程池的,所以,如果你足够熟练,请直接使用ThreadPoolExecutor来定制属于你自己的线程池吧。下面我们先来说说JDK自带的4中线程池吧,先来个总览:1 Executors.newCachedThreadPool()创建一个可缓存线程池,如果线程池长度超过处...原创 2018-12-27 15:06:32 · 2805 阅读 · 0 评论 -
3-阻塞队列的作用
先看构造函数:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...原创 2018-06-24 23:58:18 · 549 阅读 · 0 评论 -
4-Java之ReadWriteLock
使用ReadWriteLock的前提是进行读写分离,如果你的逻辑中没有读写分离而使用了ReadWriteLock,虽然不会出语法错误,但是会出现并发错误,所有弄懂了这个前提,你就能很自然的想到使用ReadWriteLock的场景,也就是说ReadWriteLock是个有默认约定的,需要我们的逻辑是正常编写,你编写的逻辑如果没有按照读写分离的约定,虽然不会有语法错误出现,但是多线程环境下就会有并发问...原创 2018-11-15 23:16:51 · 365 阅读 · 0 评论 -
5-Java锁和监视器
首先要明确的一点是监视器模型不是Java特有的,他是操作系统层次的概念,是为了实现线程同步而采取的技术手段,任何编程语言的并发设计中都可以出现这个概念。 在Java中,每个对象和Class内部都有一个锁,Class广义上也是一个单例对象,每个对象和Class会和一个监视器关联,注意措辞,锁是存在于对象内部的数据结构,监视器是一个独立的结构但是和对象关联,相同点是对象一定有一个锁也...原创 2018-06-29 10:47:35 · 2814 阅读 · 2 评论 -
Java锁
对于锁,一定有一个锁的持有者和锁本身,将这两者搞清楚和两者之间的关系梳理清楚,使用锁就可以非常清晰。锁的持有者往大里说肯定是某个线程,但是这个粒度太大,...原创 2018-06-25 23:50:58 · 120 阅读 · 0 评论 -
并发基础
内存模型内存模型属于编程语言层次规范内存模型是在谈论并发相关事宜原创 2020-02-21 16:50:31 · 135 阅读 · 0 评论 -
协程的原理
我们先有进程,然后有多进程,后来发现多进程过重,占用资源太多,然后设计了轻量级的进程,也即线程,由于并发要求的不断提高,发现多线程占用的资源也太多,于是设计了协程,多个协程是建立在一个线程的基础上的,每个协程也有自己的空间,但是比线程小多了,协程的切换是在一个线程上,所以不要在协程里调用让宿主线程休眠的IO操作,否则这个线程下的其他协程全部都被冻结。...原创 2021-04-19 19:59:45 · 116 阅读 · 0 评论 -
InheritableThreadLocal使用
从名字上可以看出InheritableThreadLocal就是用来解决父子线程继承时使用的问题,其实大致都可以猜到,我们先来看看例子:public class InheritableThreadLocalT { public static final ThreadLocal<String> threadLocal = new ThreadLocal<>();...原创 2019-01-17 18:14:00 · 2470 阅读 · 0 评论 -
happen-before
Java内存模型的本地缓存特点以及编译器的重排序和处理器的重排序会使代码的实际执行效果和原生代码的逻辑顺序不一致,如果任由这些操作发生,计算绝大多数情况下是不对的,所以Java内存模型有制定了happen-before原则,happen-before规定了那两个操作之间的影响关系,如果A操作happen-before于B操作,那么,Java虚拟机必须保证A操作对B操作可见,这样通过一定程度...原创 2018-06-29 00:06:45 · 952 阅读 · 0 评论 -
Java volatile关键字
volatile关键字的特点是使对变量的修改对其他线程可见,同时不保证原子性。这句话是建立在Java内存模型基础之上的,想要理解必须先搞懂Java内存模型等概念。...原创 2018-07-01 14:38:11 · 119 阅读 · 0 评论 -
Java Volatile关键字使用
volatile关键字在C语言和Java中都有,也就是说这个关键字应该是操作系统层次体现的特点,而不仅仅是语言层次的特性,我们应该上升到一个更高的层次来理解这个关键字。总的来说就是我们的数据最终存放在内存上,但是我们没有让cpu计算时直接从内存上进行存取,而是使用了诸如寄存器、一级缓存、二级缓存、java中内存模型还有线程内部缓存等,这些地方拷贝了同一份数据,所以会存在数据不同步的情况,那...原创 2018-10-04 21:53:00 · 145 阅读 · 0 评论 -
Java偏向锁和轻量级锁
Java SE 1.6对锁进行了大量优化工作,引入轻量级锁和偏向锁,这里只对这两种优化作说明。Java SE 1.6中的锁状态分为无锁、偏向锁、轻量锁、重量锁4种,级别依次递增,性能越来越差,且升级后不允许降级,这么做能在多数环境下有利于锁的获取和释放。 我们知道Java对象的头部是记录了对象的相关信息,具体情况看我另外文章,这里放张图好对照:上图是对象头中Mark Wo...原创 2018-06-30 15:32:29 · 330 阅读 · 0 评论 -
CAS策略
CAS是Compare And Swap的缩写,CAS是一种解决部分并发情况下的解决方案,比如多线程环境下变量的自增就可以用CAS策略解决,一般而言,CAS有三个操作数,一个是目标变量V,一个是新值N,一个是目标变量期望值E,当更新V的时候,先判断V和E是否相等,如果相等则更新,否则重新读取V作为E,循环上述更新操作,直到成功。有个很普遍但是很容易被忽视的地方,就是我们使用CAS的期望值E往往是先...原创 2018-09-04 22:55:35 · 1353 阅读 · 0 评论