synchronized 锁不住 String
时间: 2023-08-26 20:13:05 浏览: 156
java 锁机制
实际上,synchronized 是可以锁住 String 对象的。String 是一个不可变类,每次对 String 对象的修改都会创建一个新的 String 对象,但是这并不影响 synchronized 的使用。
当多个线程对同一个 String 对象进行 synchronized 操作时,只有一个线程能够获得锁,其他线程需要等待锁的释放。这是因为 Java 中的字符串常量池(String Pool)的存在。
字符串常量池是 Java 中用于存储字符串字面值的一个区域,它的目的是节省内存。当我们创建一个字符串常量时,如果字符串常量池中已经存在相同内容的字符串,则返回常量池中的引用,而不会创建新的对象。
因此,如果多个线程对同一个字符串字面值进行 synchronized 操作,它们实际上是在操作同一个对象,可以实现互斥访问。例如:
```java
String str = "hello";
synchronized (str) {
// 互斥操作
}
```
然而,如果你使用 new 关键字创建了一个新的 String 对象,那么这个对象就不再是字符串常量池中的对象,而是一个普通的对象。在这种情况下,synchronized 将无法实现对 String 对象的互斥访问。因此,在使用 synchronized 锁住 String 对象时,应该确保使用的是字符串常量或者确保不会创建新的 String 对象。
阅读全文