![](https://img-blog.csdnimg.cn/7fb3708091b4449f807cb2b7645a4cdb.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC
文章平均质量分 93
Thread
HoryC
这个作者很懒,什么都没留下…
展开
-
Reactor 线程模型
线程模型不同的线程模型,对程序段的影响很大,先来看看各个线程模型。目前存在的线程模型有:传统阻塞I/O服务模型Reactor模型根据 Reactor 的数量和处理资源池线程的数量不同,有3种典型的实现:单Reactor-单线程单Reactor-多线程主从Reactor-多线程传统阻塞IO服务模型黄色框表示对象;蓝色框表示线程;灰色框表示方法(API)模型特点:采用阻塞IO模式获取输入的数据每个连接都需要独立的线程完成数据的输入、业务处理、数据返回问题分析:原创 2021-03-09 23:07:57 · 7717 阅读 · 3 评论 -
并发系列之「通过生产者消费者场景理解wait()/ notify() / notifyAll()」
wait(long timeout)/notify()/notifyAll()`网上好多解释不是不全面就是有偏差,还是直接看官方解释先来看一下源码:public class Object { public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException;.原创 2020-10-19 22:11:20 · 257 阅读 · 0 评论 -
并发系列之「初探sleep()函数」
Thread 类中有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法后,调用sleep的线程会暂时让出指定时间的执行权,也就是在这期间不参与CPU的调度,但是该线程所拥有的监视器资源,比如锁还是持有不让出的。指定的睡眠时间到了后该函数会正常返回,线程就处于就绪状态,然后参与CPU的调度,获取到CPU资源后就可以继续运行了。如果在睡眠期间其他线程调用了该线程的interrupt()方法中断了该线程,则该线程会在调用sleep方法的地方抛出InterruptedExceptio原创 2020-10-19 22:09:31 · 247 阅读 · 0 评论 -
并发系列之「Java中的synchronized关键字」
本文为《Java并发编程之美》学习笔记Java中共享变量的内存可见性问题在讲synchronized之前先来讲一下Java中共享变量的内存可见性问题。先来看看在多线程下处理共享变量时Java的内存模型:Java内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作工作内存,线程读写变量时操作的是自己工作内存中的变量。Java内存模型是一个抽象的概念,那么在实际实现中线程的工作内存是什么呢?实际上的内存模型:图中所示是一个双核CPU系.原创 2020-10-13 21:26:09 · 132 阅读 · 0 评论 -
并发系列之「sleep(0)」
操作系统前置知识在讲两者的区别前,先回顾一下操作系统的知识。操作系统中,CPU竞争有很多种策略:Unix系统使用的是时间片算法Windows 则属于抢占式的在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。所谓抢占式操作.原创 2020-10-13 00:52:10 · 141 阅读 · 0 评论 -
并发系列之「用户线程与守护线程」
守护线程 Daemon Thread守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我们需要知道一个问题,那就是:JVM 程序在什么情况下能够正常退出?The Java Virtual Machine exits when the only threads running are all daemon threads.上面这句话来自 JDK 官方文档,意思是:当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。理解起来有点抽原创 2020-10-11 23:56:19 · 96 阅读 · 0 评论 -
死锁之「互斥条件和不可剥夺条件的区别」
产生死锁的四个必要条件互斥条件进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。不可剥夺条件进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。保持与请求条件进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。循环等待条件存在一种进程资源的循环等待链,链中每一个进程已.原创 2020-10-09 11:18:44 · 3644 阅读 · 2 评论 -
并发系列之「wait()函数」
本篇博客为《Java并发编程之美》学习笔记wait()函数当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回:其他线程调用了该共享对象的notify()或者notifyAll()方法;其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。另外需要注意的是,如果调用wait()方法的线程没有事先获取该对象的监视器锁,则调用wait()方法时调用线程会抛出IllegalMonitor.原创 2020-10-08 00:35:52 · 401 阅读 · 0 评论 -
并发系列之「执行run() & start()的区别」
执行run()与start()方法的区别:public class MyThread extends Thread{ public MyThread(){ System.out.println("MyThread构造方法:"+ Thread.currentThread().getName()); } @Override public void run(){ System.out.println("run方法:"+ Thread.curren.原创 2020-10-06 10:31:04 · 113 阅读 · 0 评论 -
并发系列之「Java中创建线程的三个方式」
Java中有三种线程创建方式,分别为:继承Thread类并重写run()方法实现Runnable接口的run()方法使用FutureTask方式继承Thread类并重写run()方法/** * @Author Hory * @Date 2020/10/5 */public class ThreadTest { public static void main(String[] args) { MyThread thread = new MyThre原创 2020-10-05 23:47:24 · 157 阅读 · 0 评论 -
关于Java的volatile关键字
# 前言首先讲解一下多线程的概念,然后通过一个案例来加深对volatile关键字的理解最后讲解一些volatile关键字的原理及牵扯到的相应知识。# 请讲述一下volatile关键字它是轻量的synchronized在多处理器开发中保证了共享变量的可见性可见性就是当一个线程进行修改共享变量的时候,保证将变量的更新操作通知到其他的线程如果该关键字使用恰当,那么效率比synchronized要好,因为不会引起线程的上下文切换和调度volatile 关键字能保证内存的可见性,但是不能保证原子性原创 2020-07-23 17:55:14 · 133 阅读 · 0 评论 -
Java多线程之「线程的生命周期」
在 Java 当中,线程通常都有五种状态,创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)和死亡(dead)。新建(NEW):新创建了一个线程对象。实现Runnable接口和继承Thread可以得到一个线程类,new 一个实例出来,线程就进入了初始状态。可运行(RUNNABLE):有的地方也叫就绪状态,线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU 的使用权 .原创 2020-09-15 15:51:44 · 170 阅读 · 0 评论