synchronized锁方法锁不住
时间: 2023-03-29 18:01:08 浏览: 72
这个问题可以回答。synchronized锁方法是可以锁住的,但是如果锁的是非静态方法,那么锁的是对象实例,如果有多个线程同时访问不同的对象实例,那么锁是无效的。如果锁的是静态方法,那么锁的是类对象,可以保证同一时刻只有一个线程访问该方法。
相关问题
synchronized 锁不住 String
实际上,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 对象。
synchronized 锁住方法
回答: 在Java中,synchronized关键字可以用来锁住方法,以实现线程同步。当一个线程进入synchronized锁住的方法时,其他线程必须等待该线程执行完毕才能进入该方法。此时,锁对象是方法所属的对象实例。例如,引用中的代码片段展示了在synchronized块中使用this作为锁对象。另外,引用展示了在synchronized块中使用实例中的成员变量作为锁对象的例子。还有一种使用synchronized锁住方法的方式是在方法声明中使用synchronized关键字,如引用所示,这种方式相当于锁住的是类对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [synchronized锁住的对象](https://blog.csdn.net/llxxjjllll/article/details/120444095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
- *2* [synchronized的几种加锁方式](https://blog.csdn.net/jarniyy/article/details/107954430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]