多线程
并行:同一时刻,多个指令在cpu同时执行
并发:同一时刻,多个指令在cpu交替执行
进程:正在运行的软件
1:继承 Thread类
优点:编程简单 可以直接使用Thread类中的方法
缺点:可扩展性差,不能再继承其他的类。
2:实现Runnable接口 无返回值
3:实现Callable接口 有返回值
优缺点与继承Thread方法相反。
Thread.currentThread:当前线程执行的主方法
Thread.sleep:线程等待(休眠)多少时间。
synchronized:锁
死锁的概念:由于两个或者多个线程互相持有对方所需要的资源,导致线程处于等待的状态,无法继续执行
wait: 导致当前线程等待,知道另外一个线程调用对象的notify()方法或者notifyAll()方法。
notify:唤醒当前等待对象监视器的单个线程
notifyAll:唤醒正待等待对象监视器的所有线程
Executors.newFixedThreadPool(x): x:指定线程驰上线
创建线程池:
1 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, //核心线程数量 --》不能小于0 2 3, //最大线程数 --》不能小于0 && 大于等于核心线程数量 3 10, //空闲线程最大存活时间 --》不能小于0 4 TimeUnit.SECONDS, //空闲线程最大存活时间的单位 --》必须是时间单位 TimeUnit 5 new ArrayBlockingQueue<>(10) //任务队列 --》 不能为null 6 , Executors.defaultThreadFactory(), //创建线程工厂 --》 不能为null 7 new ThreadPoolExecutor.CallerRunsPolicy()); //任务的拒绝策略 --》 不能为null
Volatile关键字:强制线程每次在使用的时候,都会看一下共享区域的最新值。但是它不具有原子性。
原子性:多个操作是一个不可分割的整体,例如:我将钱从A卡打到B卡,要么A卡发送失败,同时B卡接收失败,要么同时成功。不会有别的情况。
Atomicinteger():就具备原子性,他的底层运用了CAS算法。
incrementAndGet:Atomicinteger的对象的自增方法。
CAS算法:有三个操作数(内存值V,旧的预期值A,要修改的值B),当旧的预期值A == 内存值,此时修改成功,将V改为B;当旧的预期值A != 内存值,此时修改失败,不做任何操作,并重新获取现在的最新值(这个重新获取的动作就是自旋)
悲观锁和乐观锁:
相同点:悲观锁和乐观锁都是在线程情况下,保证共享数据的安全性。
不同点:synchronized总是从最坏的角度出发,认为没次获取数据的时候,别人都有可能修改,所以在每次操作共享数据之前,都会上锁,同时也称为:悲观锁。
cas总是从乐观的角度出发,假设每次获取数据别人都不会修改,所以不会上锁。不过在修改共享数据的时候,会检查一下,别人有没有修改过这个数据。如果别人修改过,那么再次过去现在的最新的值;如果别人没有修改过,那么我现在直接修改共享数据的值。(乐观锁)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现