Java 多线程
文章平均质量分 54
根据B站UP主“遇见狂神说”的多线程课程所做笔记
lhlyzh
努力奋进中的小白
展开
-
十、生产者消费者问题
一、生产者消费者问题 1. 问题 假设仓库中只能放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库。否则停止生产并等待,直到仓库中的产品被消费者取走为止 如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止 2. 分析 生产者和消费者共享同一个资源,并且两者之间相互依赖,互为条件 对于生产者,没有生产产品之前要通知消费者等待。而生产了产品之后又需要立即通知消费者 对于消费者,在消费之后要通知生产原创 2021-08-02 16:49:03 · 795 阅读 · 0 评论 -
九、Lock 锁
Lock 锁 1. 概要 从 JDK5 开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用 Lock 对象充当 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源访问的工具 锁提供了对共享资源的独占访问,每次只能有一个线程对 Lock 对象加锁,线程开始访问共享资源前须先获得 Lock 对象 ReentrantLock类(可重入锁)实现了 Lock ,它拥有与synchronized相同的并发性和内存语义 在实现线程安全的控制中原创 2021-08-02 16:46:45 · 58 阅读 · 0 评论 -
八、死锁
一、死锁 1. 原因 多个线程同时被阻塞,其中一个或全部都在等待某个资源被释放。由于线程被无限期的阻塞,因此程序无法正常终止。如图线程A占有资源1,线程B占有资源2,双方同时申请对方的资源,就会互相等待而进入死锁状态。 例: public class DeadLock { public static void main(String[] args) { Makeup girl1 = new Makeup(0, "第一个女孩"); Makeup girl2 =原创 2021-08-02 16:45:39 · 51 阅读 · 0 评论 -
七、线程同步
一、并发与并行 并发:同一时间段内,多个任务都在执行。CPU可以把执行时间分成若干份,每个线程执行一段时间后记录当前工作状态 并行:单位时间内多个任务同时执行 二、线程同步 注: 锁的对象一定要是属性有增删改的对象!!! 所谓线程同步并不是使线程同时执行,而是将线程排队!!! 1. 形成条件:队列 + 锁 为保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized, 当一个线程获得对象的排它锁独占资源时,其它线程必须等待。使用后释放锁即可。 会产生以下问题: 一个线程持有锁会导原创 2021-08-02 16:43:37 · 44 阅读 · 0 评论 -
六、守护线程
守护(Daemon)线程 线程分为用户线程和守护线程 虚拟机必须确保用户线程执行完毕 虚拟机不必等待守护线程执行完毕 使用setDaemon()方法将线程设置为守护线程(默认为用户线程) 守护线程的默认优先级比较低 如:后台日志、监控内存、垃圾回收等等 例: public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new Yo原创 2021-08-02 16:42:13 · 42 阅读 · 0 评论 -
五、线程优先级
一、线程优先级 Java 提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行 线程优先级用数字标识,范围从1~10 Thread.MIN_PRIORITY = 1; Thread.MAX_PRIORITY = 10; Thread.NORM_PRIORITY = 5; 使用以下方法获取或改变优先级 getPriority() setPriority(<整数>) CPU调度会考虑优先级,但只是提高优先调度的权重,并不一定会先执行原创 2021-08-02 16:41:40 · 58 阅读 · 0 评论 -
四、线程状态
一、线程状态 操作系统中,线程被视为轻量级的进程,因此操作系统的线程状态与操作系统的进程状态是一致的 1. 线程五大状态 创建状态 Thread t = new Thread() 线程对象一旦创建就进入到了新生状态 就绪状态 当调用start() 方法,线程会进入就绪状态,但不意味着立即执行 运行状态 进入运行状态,线程才会真正去执行线程体的代码 阻塞状态 当调用sleep()、wait()或同步锁定时,线程进入阻塞状态,代码不会继续执行。等待阻塞事件解除后,重新进入就绪状态,等待CPU调度原创 2021-08-02 16:41:02 · 254 阅读 · 0 评论 -
三、静态代理模式
静态代理模式 静态代理是多线程底部的原理,在 Java 中线程的设计就使用了静态代理设计模式,其中自定义线程类及Thread类都是实现了Runnable接口。 在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()方法,调用自定义线程对象的run()方法。实现了线程的并发执行。 概要 真实对象和代理对象都要实现同一个接口 代理对象要代理真实角色 真实对象只专注于自己的功能,代理对象可以帮忙做其他的事 步骤 定义抽象接口 定义真实对象的类 定义代理对象的类 通过代理对象调用实原创 2021-08-02 16:38:22 · 43 阅读 · 0 评论 -
二、线程的创建
一、创建方式 线程的创建有三种方式: 继承Thread类 实现Runnable接口 实现Callable接口 注:线程开启不一定立即执行,由CPU调度决定 1. 继承Thread类 继承Thread类创建线程可分为以下几步: 自定义线程类继承Thread类 重写run() 方法,编写线程执行体 创建线程对象,调用start()方法启动线程 例: public class TestThread extends Thread { @Override public void run()原创 2021-08-02 16:37:20 · 278 阅读 · 0 评论 -
一、进程与线程
一、进程和线程的定义 1. 进程 进程是执行程序的一次从创建到消亡的过程。程序本身只是指令和数据的有序集合,是一个静态概念。而进程是一个动态的概念,是系统资源分配的单位。 注:一个进程只能对应一个程序,而一个程序可以对应多个进程 2. 线程 线程是一个比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,当然也至少会存在一个线程,否则进程就没有存在的意义。线程是CPU调度和执行的单位。 注:真正的多线程是指有多个CPU,即多核。很多多线程是模拟出来的,即在一个CPU的情况下,在同一个时间点,CP原创 2021-08-02 16:35:27 · 82 阅读 · 0 评论