商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java 中继承 Thread 后如何正确实现线程同步

Java 中继承 Thread 后如何正确实现线程同步

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

继承 `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) - 避免在同步块里做可能长时间阻塞的操作,防止其他线程无限等待

Java 中继承 Thread 后如何正确实现线程同步

本文转载于:https://www.php.cn/faq/2794157.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注