Java 中继承 Thread 后如何正确实现线程同步
作者:WeekendLife
时间:2026-07-09
浏览:0
继承 `Thread` 类后要实现线程同步,最让人头疼的问题往往不是语法本身,而是锁对象选不对——每个线程实例都拿着自己那把锁,synchronized 形同虚设。下面这几个要点,是实际开发中必须摸透的,尤其是初学者,很容易在“锁”上栽跟头。 ### 必须用同一个对象作为同步监视器 继承 `Thre
继承 `Thread` 类后要实现线程同步,最让人头疼的问题往往不是语法本身,而是锁对象选不对——每个线程实例都拿着自己那把锁,synchronized 形同虚设。下面这几个要点,是实际开发中必须摸透的,尤其是初学者,很容易在“锁”上栽跟头。
### 必须用同一个对象作为同步监视器
继承 `Thread` 时,每个线程对象都是独立实例,`synchronized` 实例方法锁的是各自对象(`this`),相当于每人一把锁,起不到同步效果。正确做法是让所有线程共用一个锁对象:
- 把共享资源和锁声明为 `static`,例如 `private static final Object LOCK = new Object();`
- 或在构造时传入同一个外部对象(如主类实例、单例工具类)作为锁
- 避免直接用 `this` 或 `Thread.currentThread()` 做锁,它们对每个线程都不一样
### 推荐使用 synchronized 代码块而非同步方法
同步方法会锁住整个 `run()` 执行过程,粒度太粗,影响并发效率。更合理的是只锁定真正操作共享资源的那一小段:
- 写法示例:`synchronized (LOCK) { num--; }`
- 锁内只放读写共享变量、修改状态等关键语句,不要包含 `sleep()`、IO 或耗时逻辑
- 如果必须用同步方法,需确保它是 `static` 的(锁 `Class` 对象),否则仍无效
### 共享资源必须声明为 static
模拟卖票、计数器等场景时,票数、计数器等变量必须用 `static` 修饰:
- 非 `static` 字段属于每个线程实例,彼此隔离,根本不存在竞争
- `static` 才能让所有线程看到同一份数据,同步才有意义
- 配合 `volatile` 可解决可见性问题(如状态标志),但不能替代同步解决原子性
### 注意异常处理与中断响应
在同步块内调用 `sleep()` 或 `wait()` 时,可能抛出 `InterruptedException`:
- 不能简单 `e.printStackTrace()` 后吞掉异常,应恢复中断状态:`Thread.currentThread().interrupt();`
- 同步块中发生异常,要确保锁能正常释放(Java 自动保证,无需手动 unlock)
- 避免在同步块里做可能长时间阻塞的操作,防止其他线程无限等待
本文内容来源于互联网,如有侵权请联系删除。

作者最新文章
打印机暂停打印的解决方法及恢复正常打印步骤
2026-09-22 14:32
华强北手机全线涨价:涨幅400-1500元,存储成本推高售价
2026-09-08 19:22
PDF转XML操作步骤与在线工具使用指南
2026-09-03 10:06
如何把多个PPT转成PDF?批量转换PDF的方法有哪些?
2026-09-02 19:32
CorelDRAW 2021图片虚化与边缘处理教程
2026-09-02 15:44
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































