![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程和高并发
文章平均质量分 85
monday-pro
这个作者很懒,什么都没留下…
展开
-
Java异步编程的核心类:FutureTask
目录一、FutureTask1、FutureTask的通俗解释2、FutureTask标准用法3、FutureTask源码既然要说异步编程,肯定首先得知道啥是异步、啥是同步,我在文章同步和异步、阻塞和非阻塞的区别中已经讲过了,此处就不再赘述了。一、FutureTask1、FutureTask的通俗解释有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,同时你就去看球赛了(但是你不想被打扰,就跟你妈说,饭做好了贴个墙纸就好了)。你妈把饭做好并端到餐桌上原创 2021-07-15 23:13:51 · 229 阅读 · 0 评论 -
同步和异步、阻塞和非阻塞的区别
目录一、什么是异步编程1、同步阻塞2、同步非阻塞3、异步方式14、异步方式2一、什么是异步编程我们以一种通俗易懂的方式来说说啥是同步、啥是异步;相信看完就不会再有疑惑了。1、同步阻塞有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,你就在外面等着饭做好,啥也不干,这就是同步阻塞。(调用方阻塞不能干其他的事)2、同步非阻塞同样,有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,然后你就去看电视了原创 2021-07-07 22:44:44 · 140 阅读 · 0 评论 -
Java线程与常用线程池体系
目录一、线程池的整体类图1.Executor2.ExecutorService3.AbstractExecutorService一、线程池的整体类图(实线是继承 虚线是实现)1.Executor:线程池顶级接口2.ExecutorService:线程池次级接口,对Executor做了一些扩展,增加了一些功能3.ScheduledExecutorService:对ExecutorService做了一些扩展,增加了一些定时任务相关的功能4.AbstractExecutorService:抽原创 2021-05-09 09:54:11 · 141 阅读 · 0 评论 -
ThreadPoolExecutor 源码解析
目录一、ThreadPoolExecutor解析1、线程池的5种状态2、状态之间的转换3、默认的4种拒绝策略二、源码分析1、向线程池提交任务:execute()2、创建新线程:addWorker(Runnable firstTask, boolean core)3、线程的主循环Worker:runWorker(Worker w)4、从队列中获取排队的任务:getTask()5、线程结束:一、ThreadPoolExecutor解析1、线程池的5种状态 private static final i原创 2021-05-21 14:50:13 · 130 阅读 · 1 评论 -
ScheduledThreadPoolExecutor 核心源码
目录一、构造函数二、schedule方法(1)RunnableScheduledFuture(2)ScheduledFutureTask(3)decorateTask(4)delayedExecute一、构造函数 public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWork原创 2021-05-20 22:49:32 · 162 阅读 · 0 评论 -
一个容器,两个方法add,size。起两个线程,线程一添加10个元素到容器中,线程二监控容器元素个数,5个时线程二给出提示并结束
目录一、sync的wait和notify二、CountDownLatch三、LockSupport一、sync的wait和notifypublic class T04 { private static List lists = new ArrayList(); private static void add(Object o) { lists.add(o); } private static int size() { return l原创 2020-09-12 11:38:08 · 137 阅读 · 0 评论 -
JUC 常见的锁
目录一、AtomicInteger1、底层实现(1) 如果在执行CAS操作的时候,在判断值是否为我期望的值后,马上有其他线程把这个值改为了其他的值,那这种情况不是依然有问题吗?(2)ABA问题(3)CAS底层是怎么做到的?2、SyncLong VS AtomicLong VS LongAdder二、ReentrantLock1、公平锁与非公平锁2、reentrantlock VS synchronized三、CountDownLatch(倒数 门闩)四、CyclicBarrier (循环 栅栏)五、Phas原创 2020-09-11 23:30:55 · 1681 阅读 · 0 评论 -
volatile详解
目录一、作用1、保证线程可见性2、禁止指令重排序3、volatile不能保证原子性一、作用1、保证线程可见性main线程和T线程共享堆内存的数据;main和T也有自己的工作空间,当要访问共享内存的数据flag,会把共享内存的flag复制一份到自己的工作空间中。例如main线程对flag进行了改变,首先是在自己的空间进行改变,修改后的值会马上修改到共享内存;但是T线程何时检查共享内存的值有没有被改变不好控制。即 main线程的修改并没有及时的反应到T线程,也就是线程之间不可见。对这个变量加了vola原创 2020-09-10 10:07:21 · 119 阅读 · 0 评论 -
synchronized详解
目录一、概念1、同步方法和非同步方法可以同时执行2、synchronized是可重入锁3、加锁的方法产生异常会释放锁4、synchronized(Object)二、底层实现一、概念多个线程访问同一个资源时,需要对该资源上锁。即同时只允许一个线程访问该资源。任何线程要执行synchronized里的代码,都必须先拿到锁。synchronized底层实现,JVM并没有规定必须应该如何实现,Hotspot在对象头上(64位)拿出2位来记录该对象是不是被锁定,markword,即锁定的是某个对象。每一个cla原创 2020-09-09 18:27:13 · 255 阅读 · 0 评论 -
线程的状态
1、Ready:处于CPU的等待队列,排队等待执行。2、Running:正在被CPU执行的状态。调用Thread.yield()会进入到Ready状态。3、TERMINATED:线程运行结束。结束运行的线程不能再调用start()。4、线程被挂起:在一个CPU上会跑多个线程,CPU隔一段时间执行t这个线程,隔一段时间执行t2线程,从t切换到t2时,t线程就被挂起了。5、不要用stop()去关闭一个线程,而是应该让线程正常结束,用stop()太粗暴且方法也已经过时了,可能会引起线程状态的不一致问题。.原创 2020-10-31 15:18:09 · 80 阅读 · 0 评论 -
线程相关的一些基本概念
线程相关的一些基本概念一、程序二、进程三、线程四、纤程/协程一、程序例如QQ、微信等这样的应用,即是程序。二、进程进程就是一个程序运行起来的状态。三、线程线程是一个进程中不同的执行路径。专业一点的解释:进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:开辟独立的内存空间,线程再调度执行(即线程共享进程的内存空间,没有自己独立的内存空间)四、纤程/协程纤程是用户态的线程,线程中的线程;纤程的切换和调度不需要经过OS。1、与线程相比:纤程特点1)占有资源少,一般原创 2020-09-07 22:12:13 · 171 阅读 · 0 评论