Java基础总结—多线程篇
1|0多线程【重点】
1|1一、基础知识
1、进程和线程区别
进程是资源分配的最小单位,线程是cpu调度的最小单位,一个进程中可以包含多个线程
2、线程的三种创建方式
-
继承Thread类
-
实现Runnable接口
-
实现Callable接口 (jDK8新特性)
3、线程的生命周期
线程有时间片,才会运行,不然就抢夺时间片!
4、获取当前线程对象
5、线程休眠 Thread.sleep
了解
-
线程优先级
-
线程合并
-
线程让位
需要注意:Java的线程调度是抢占式调度模型,优先级高的线程抢占时间片的概率大!
1|2二、线程安全 *
线程安全问题的产生需要满足:多线程并发、共享数据、共享数据有修改操作 ,如:两人同时取银行卡里的余额!
怎么解决线程安全问题?
- 引入“线程同步机制”,也就是让线程排队,不再并发执行
- 为了安全,可以牺牲一部分效率
了解 异步,同步编程模型
- 异步编程模型 : 线程t1 ,t2各自执行各自的,t1不管t2,t2不管t1 ;谁也不需要等谁,本质就是多线程并发
- 同步编程模型: 线程t1 ,t2需要满足 t2执行之前必须等待t1线程执行结束,两线程发生了等待关系 本质:线程排队执行
注意:异步就是并发,同步就是排队
Synchronized 同步代码块
为什么非得传入共享对象?
因为传入一个共享对象,两个线程中共享的这一个对象的对象锁被拿走,另一个对象无法获取,因此无法进入同步代码块!但是如果传入的是非共享对象,则一个线程把这个非共享对象的锁拿走,并不影响另外一个线程任何操作! (共享可以看作,两线程共用这一个)
局部变量是线程安全的!因为存储在栈中,数据不共享,常量不可修改也是线程安全的!
静态变量和实例变量则是分别在方法区和队中,存在数据共享,可能会导致线程不安全问题
Synchrnoized三种写法
方式一:同步代码块
方式二:实例方法上添加Synchronized
方式三:在类上添加Synchronized
扩展:对象锁保证的是实例变量的安全、类锁保证的是静态变量的安全!
1|3三、死锁
实现一个死锁,由于死锁不会报错,因此很难调试,我们只有会写死锁,以后才能注意 !
1|4四、守护线程
守护线程一般在默默运行,用户线程全部结束,守护线程也会自动结束!
线程分为两类:
- 用户线程
- 守护线程
创建一个线程,直接设置为守护线程即可
1|5五、定时器
实际开发中,每隔多久执行一段特定的程序,这种需求是很常见的!
方式一:Thread.Sleep, 设置睡眠多长时间,执行任务,最原始的方式 ;
方法二:Java类库中写好的一个定时器java.util.Timer,可以直接用,但是用的少,框架一般都带自己的定时器,
方式三 : 使用最多的就是spring框架当中提供的springTask框架,只需简单的配置就可以完成定时器(底层还是方式二);
1|6六、wait和notify
wait() 和 notify () 是Object 的方法 , 通常结合synchrnoized使用
- wait()意思是说,我等会儿再用这把锁(对象锁!),CPU也让给你们,我先休息一会儿!
- notify()意思是说,我用完了,你们谁用?
测试代码:
生产者消费者模式
__EOF__

本文链接:https://www.cnblogs.com/qxsong/p/15837294.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~