在多线程编程中,synchronized
关键字是Java开发者最常用的同步工具之一。它能够确保线程安全,但使用不当可能导致性能问题、死锁甚至隐藏的逻辑错误。本文将通过代码案例和场景分析,总结synchronized
使用中的典型问题,并提供优化建议。
一、锁对象选择错误:同步失效
问题描述
synchronized
的锁是基于对象的,如果锁对象选择错误,可能导致多个线程看似“同步”实则并行执行,破坏线程安全。
示例代码:
public class InvalidLockExample { private final String lock = "lock"; // 字符串字面量驻留,可能被其他类共享 public void doTask() { synchronized(lock) { // 临界区操作 } } }
问题分析
如果其他类也使用相同的字符串字面量(如"lock"
)作为锁,可能导致不同类的代码块共享同一把锁,引发意外的同步阻塞。
解决方案