多线程
文章平均质量分 78
薛之豪
随心写写,记录点滴
展开
-
Java 多线程之线程状态转换(十五)
假设有线程 Thread t1、NEW ==》 RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLE2、RUNNABLE 《==》 WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用obj.wait() 方法时,t 线程从RUNNABLE --> WAITING调用 obj.notify() ,obj.notifyALL () , t.interrupt() 时竞争锁成功, t 线程从 WAITING .原创 2021-01-10 22:03:53 · 90 阅读 · 0 评论 -
Java多线程之 Park和Unpark(十四)
介绍Park 和 Unpark 均是 LockSupport 类中的方法//暂停当前线程LockSupport.park();//恢复某个线程LockSupport.unpark(暂停线程对象);先 park 再unpark Thread thread = new Thread(() -> { System.out.println("start....."); try { Thread.sleep(原创 2021-01-05 23:57:50 · 6085 阅读 · 0 评论 -
Java多线程之死锁
死锁是什么?定义: 指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。举个例子:两个小孩,小王持有玩具,小明持有电视遥控。小王想看电视,要拿遥控器,但对手里的玩具不肯放手。小明想玩玩具,但对手里的遥控器也不打算放手。看来双方都是全都要!于是大家都在做零和博弈,吃着碗里的看着锅里的。这就是典型的生活死锁想想。import lombok.extern.slf4j.Slf4j;import java.util.concur原创 2020-12-19 23:57:45 · 106 阅读 · 4 评论 -
Java多线程之 synchronized 的“锁“事(十二)
前言:synchronized 通过Monitor来实现线程同步,Monitor是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的线程同步。但 阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间 。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户代码执行的时间还要长,有点杀鸡用牛刀的感觉。所以在 Java 6 之后, 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。PS:依赖于操作系统Mutex Lock所实原创 2020-12-19 23:56:46 · 90 阅读 · 2 评论 -
Java 多线程之 Monitor (十一)
前言在后续会深入分析 synchronized 的底层原理,但在说之前必须得讲解 Monitor 做位铺垫。正文Java 对象头以 32 位 Java 虚拟机(JVM)为例子普通对象 (64 位 或 8 个字节)|--------------------------------------------------------------|| Object Header (64 bits) ||--------原创 2020-12-18 23:44:25 · 157 阅读 · 3 评论 -
Java 多线程之变量线程安全分析(十)
正文成员变量和静态变量是否线程安全?若它们没被共享,则线程安全若它们被共享,分两种情况讨论若只有读操作,则线程安全若有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是否线程安全?局部变量是线程安全的局部变量引用的对象则未必如果对象没有逃离方法的作用范围,它是线程安全的若对象逃离方法的作用范围(比如 return),需考虑线程安全的常见线程安全类StringIntegerStringBufferRandomVectorHashtablejava原创 2020-12-17 22:33:13 · 216 阅读 · 2 评论 -
Java 多线程之临界区与竞态条件(九)
正文Java 体现共享资源的问题两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果为 0 么?public class Test2 { static int j = 0; public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { for (int i = 0原创 2020-12-17 22:32:09 · 196 阅读 · 0 评论 -
Java 多线程之主线程与守护线程(七)
正文概念默认情况下,Java 进程得等待 所有线程都运行结束,才会结束。有一种特殊的线程叫守护线程,只要其它非守护线程运行结束了,即使守护线程的代码还没执行完,也会强制结束。应用垃圾回收器线程就是一种守护线程Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求线程的 5 种与 6 种状态五种状态 ——从操作系统层面初始状态,语言层创建了线程对象,未涉及操作系统可运行(就绪)状态原创 2020-12-17 22:27:12 · 305 阅读 · 0 评论 -
Java 多线程之常用方法(六)
前言Java 多线程中的方法有很多,我们就挑几个有代表性的来分析正文sleep(睡眠)调用 sleep 会让当前线程从 Running --》Timed Waiting 状态(阻塞)其他线程使用 interrupt 方法打断正在睡眠的线程, sleep 方法会抛出 InterruptedException PS: 好比一个在睡觉的人,被吵醒,有起床气!!!睡眠结束后的线程未必会立刻得到执行,因为这时的CPU 可能正在执行其他代码JDK 1.5 之后增加了 TimeUnit 的sleep原创 2020-12-17 22:23:26 · 116 阅读 · 0 评论 -
Java 多线程之 Monitor (十一)
前言在后续会深入分析 synchronized 的底层原理,但在说之前必须得讲解 Monitor 做位铺垫。正文Java 对象头以 32 位 Java 虚拟机(JVM)为例子普通对象 (64 位 或 8 个字节)|--------------------------------------------------------------|| Object Header (64 bits) ||--------原创 2020-12-17 22:11:52 · 149 阅读 · 0 评论 -
Java 多线程之线程运行原理(八)
概念栈与栈帧JVM 中由堆、栈、方法区(JDK 1.8 后改为元空间)组成,其中栈内存是给启动后的线程使用。每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的方法代码public class ThreadFrames { public static void main(String[] args) { test1(1); } private static void test1( i原创 2020-12-13 11:12:44 · 106 阅读 · 0 评论 -
Java 多线程之查看进程线程方法(五)
Windows任务管理器,查看或杀死进程我们可以看到 进程的ID (PID)以及名称cmd --》 tasklist 查看进程 taskkill 杀死进程例子taskkill /F /PID xxx/F 代表强制杀死xxx 代表进程 IDLinuxps -fe 查看所有进程ps -fT -p 查看某个进程(PID)的所有线程kill 杀死进程top 按大写 H 切换是否显示线程top -H -p 查看某个进程(PID)的所有进程Javajp原创 2020-12-13 11:06:32 · 323 阅读 · 0 评论 -
Java多线程之创建线程(四)
方法一,直接使用 Thread //创建线程,建议创建线程的时候取一个名字Thread t = new Thread("t1"){ @Override public void run() { //执行的方法 System.out.println("通过 new Thread() 方法创建线程"); }};//设置名称//t.setName("t1");//启动线程t.start();方法二,使用 Runnable 配合 Thread原创 2020-12-09 21:39:04 · 221 阅读 · 2 评论 -
Java 多线程之应用(三)
应用一异步调用同步:需要等待结果返回,才能继续运行异步:不需要等待结果返回,就能继续运行通俗易懂的说,周末在宿舍,到饭点了,我叫舍友一起去打饭,他说打完这局王者才能跟我一起去吃饭,我一直在那等他,这就叫同步我喊舍友一起去吃饭,舍友在打游戏,说知道了,我一个人去食堂打饭去了,这就叫异步特点多线程可以让方法执行变为异步。避免因为执行某个耗时的方法,而使得其他代码都暂停,浪费时间。上面的例子,我因为等待舍友打完游戏,才能一起去吃饭,如果我不等他,我可能早就打完饭回宿舍开吃了。实际应用视频原创 2020-12-09 21:35:19 · 99 阅读 · 0 评论 -
Java多线程之并行并发傻傻分不清楚(二)
背景单核时代单核 CPU 情况下,线程实际上是串行执行任务的。操作系统这个 BOSS,手底下有个狗腿子叫任务调度器,将 CPU 的时间片段分给不同线程使用。因为计算机的线程切换速度非常快,给人感觉就是同时运行的错觉。一般将这种 线程轮流使用 CPU 的做法称为并发。一句话概括:微观上串行,宏观上并行。多核时代当然,时代是在进步的,现在的计算机基本上是多核 CPU 了,什么双核四线程,八核十二线程的,归根结底都是为了提高 CPU 的利用率。多核 CPU 下,每个核都可以调度运行线程,这时的线程可原创 2020-12-05 22:14:00 · 228 阅读 · 0 评论 -
Java 多线程之进程与线程(一)
前言虽然各种框架技术日益更新,但终究逃不过基础,年轻人,耗子尾汁,别再犯这样的聪明,小聪明啊。正文进程程序由指令和数据组成,而指令要运行、数据要读写,就必须将指令加载到 CPU 里,数据加载到内存。在指令运行过程中还要用到其他资源(磁盘、网络)。 进程就是用来加载指令、管理内存、管理IO的当一个程序被运行,从磁盘加载到内存,就代表开启一个进程。进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。原创 2020-12-05 20:57:42 · 63 阅读 · 0 评论