Java线程同步
一、定义
当两个或多个线程需要访问同一资源时,需要以某种顺序来确保该资源某一时刻只能被一个线程使用
二、实现线程同步的方法
同步方法( synchronized )
同步代码块( synchronized)
三、同步代码块
同步代码块:synchronized放在对象前面限制一段代码的执行
语法格式:
synchronized(对象)//这个对象可以为任意对象 ,该对象就是锁
{
需要被同步的代码
}
同步条件
必须要有两个或者两个以上的线程
缺点:
多个线程需要判断锁,较为消耗资源
四、锁
互斥锁
同一时刻只能有一个线程占用,其他线程要等这个线程执行完释放锁以后才能使用锁
任意锁
可以是任意类型对象
多个线程必须使用同一个锁 , 才能起到互斥的作用
同步中的锁
同步代码块:this或其他共同对象
非静态方法:this
静态方法:类.class
注意:
任意锁和互斥锁是同一个锁,只是从不同角度出发,定义为不同的锁。任意锁:指对象类型可以任意;互斥锁指锁一次只能让一个线程用
五、同步方法
同步非静态方法
synchronized放在方法声明中,表示整个方法为同步方法,锁定this对象,如果有一个线程进入了该方法,其他线程要想使用当前this对象的任何同步方法,都必须等待前一个线程执行完该同步方法之后
同步静态方法
synchronized放在static方法声明中,表示锁定该类的class对象(Xxx.class,是Class类型的,是描述一个类的信息的对象)
如果有一个线程进入了该方法,其他线程要想使用当前类中的任何同步静态方法,都必须等待前一个线程执行完该同步方法之后;其他非同步方法及非静态的同步方法的执行不受影响
六、锁的选择
多个线程共享资源,为了保证数据安全,需要同步
一般情况下选择资源作为锁(必须为引用类型)即可,也可以选择其他唯一的对象
七、死锁
线程双方都持有者自己的锁不放,还想要对象的锁,僵持着,于是产生死锁
死锁发生的条件
同步中嵌套同步
锁不同
八、守护线程
1)在Java中有两类线程
User Thread(用户线程或前台线程)
Daemon Thread(守护线程或后台线程)
2)其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了
3)设置守护线程的方法要写在 start前面
4)子线程设置成为守护线程, 当主线程 执行完了,子线程就结束执行
5)线程对象.setDaemon(true) 默认为false
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· JavaScript中如何遍历对象?
· 领域模型应用
· 记一次 ADL 导致的 C++ 代码编译错误
· MySQL查询执行顺序:一张图看懂SQL是如何工作的
· 为什么PostgreSQL不自动缓存执行计划?
· 从被喷“假开源”到登顶 GitHub 热榜,这个开源项目上演王者归来!
· Stack Overflow,轰然倒下!
· Cursor 1.2重磅更新,这个痛点终于被解决了!
· C#脚本化(Roslyn):如何在C#脚本中引入nuget包
· 2025年推荐6个好用的 Postman 替代工具