Java synchronized显式锁可见性保证及同步方案选择疑问
问题1:进入锁保护区域后线程能否看到a、b、c的最新内容?
可以,Java的synchronized同步块同时保证原子性和可见性:
- 线程进入
synchronized(lock)块时,会强制清空工作内存中共享变量的缓存,从主内存读取最新值 - 线程退出同步块时,会把所有对共享变量的修改刷新回主内存
只要你所有对a、b、c的读写操作全部都用同一个lock对象的同步块包裹,就一定能保证可见性。如果有任何一处读写操作跳过了lock保护,这个保证就会失效。
问题2:锁和a、b、c字段是否存在绑定关系?
二者没有语法层面的强制绑定,绑定关系完全是你在代码逻辑层面约定的规则:你规定了所有访问a、b、c的操作必须先持有lock对象的锁,JVM不会主动校验这个规则。如果出现绕过lock直接读写三个字段的代码,就会直接触发线程安全问题。
问题3:该场景推荐显式私有锁还是this锁/方法级synchronized?
更推荐你当前使用的私有显式锁对象方案,优势如下:
- 锁粒度更灵活:你可以精准控制加锁的代码范围,不会像方法级
synchronized(等价于this锁)那样强制把整个方法纳入锁范围;如果后续有其他不相关的状态需要保护,还可以新增不同的私有锁,进一步降低锁冲突概率。 - 避免锁泄露:如果用this作为锁,外部持有Sample类实例的代码可以随意对该实例加锁,甚至恶意持有锁不释放,直接导致你内部的同步逻辑完全失效。私有锁对象是类内部的私有字段,外部拿不到引用,完全不会被外部逻辑干扰。
如果你的核心诉求是尽可能缩小锁保护范围,私有显式锁是最优选择。
内容的提问来源于stack exchange,提问作者Ihor M.
相关产品推荐
相关产品推荐

