Synchronized

synchronized 可以锁字符串吗

1362 阅读

`synchronized`只能锁住引用相同的对象。`new String("...")`每次都会生成不同的堆对象,导致并发不受限制;而直接使用字面量或 `String.intern()` 把字符串放入常量池后,所有线程锁的是同一实例,才能实现互斥。但把所有字符串放入常量池会占用大量内存,回收只能依赖 Full GC,存在性能风险。推荐使用 Guava 的 `Interner`(弱引用实现),既能保证同一值的唯一锁,又能在内存不足时自动回收。

Synchronized详解

1342 阅读

synchronized 用于对共享可变资源实现互斥访问,其本质是对象的 monitor 锁。JVM 将 synchronized 编译为 monitorenter/monitorexit 指令,进入对象的 Monitor 并在退出时释放。每个对象的 Mark Word 保存锁状态,锁可在无锁、偏向锁、轻量级锁和重量级锁之间单向升级;为降低竞争开销,JVM 进一步提供锁粗化、锁消除、偏向锁、轻量级锁、自旋等优化。通过这些机制,synchronized 在 JDK 1.5 以后已能与显式 Lock 的并发性能基本持平。