synchronized修饰普通方法
时间: 2023-08-19 11:06:14 浏览: 78
当synchronized修饰普通方法时,该方法成为了一个同步方法,只有一个线程可以同时执行该方法。当一个线程进入该方法时,它会获得该方法所属对象的锁,其他线程必须等待该线程执行完毕并释放锁后才能进入该方法。这样可以确保在多线程环境下,对该方法的访问是线程安全的,避免了多个线程同时修改共享数据的问题。\[1\]
#### 引用[.reference_title]
- *1* *2* *3* [Java中synchronized的几种使用方法](https://blog.csdn.net/justlpf/article/details/130288231)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
相关问题
synchronized用于静态方法与普通方法有区别吗?
在Java中,synchronized关键字用于控制多个线程对共享资源的并发访问。synchronized既可用于实例方法,也可用于静态方法。但是,对于静态方法和实例方法,synchronized在效果上是有区别的。
实例方法:
当一个线程调用对象的实例方法时,它会获得该实例的锁,这意味着其他线程无法在同时调用该实例的同一个同步方法。但是,不同实例的同步方法可以同时运行,因为它们拥有不同的锁。这是因为每个实例都有一个隐式的锁对象,线程必须持有该锁对象才能进入同步代码块。例如:
```
public synchronized void method() {
//code
}
```
修饰实例方法时,在多线程并发时相当于对类实例加了一个锁,只要线程获得了该实例的锁,就可以执行synchronized方法体中的代码了。
静态方法:
静态方法使用synchronized修饰时,该方法相当于只有一个实例(类实例)并被该实例所锁定。多线程并发时,只要线程获得了类对象(class)的锁,就可以执行synchronized方法体中的代码了。例如:
```
public static synchronized void method() {
//code
}
```
修饰静态方法时,在多线程并发时相当于对类实例加了一个锁,只有一个线程能执行类中的同步方法(synchronized修饰的方法),而无法执行其他线程的同步方法。
综上所述,synchronized用于静态方法与普通方法是有区别的。在多线程并发时,synchronized修饰的实例方法是以对象为锁,而synchronized修饰的静态方法是以类为锁。
synchronized 锁不住普通对象
实际上,synchronized 是可以锁住普通对象的。当我们使用 synchronized 关键字修饰一个代码块或方法时,它会获取对象的锁来实现线程的同步。
当多个线程对同一个普通对象进行 synchronized 操作时,只有一个线程能够获得该对象的锁,其他线程需要等待锁的释放。在获得锁的线程执行完同步代码块或方法后,会释放锁,其他线程才有机会获得锁并执行相应的同步操作。
例如,我们可以创建一个普通对象,并在多个线程中使用 synchronized 来进行互斥访问:
```java
class MyObject {
public synchronized void myMethod() {
// 互斥操作
}
}
MyObject obj = new MyObject();
// 在多个线程中调用对象的同步方法
Thread t1 = new Thread(() -> {
obj.myMethod();
});
Thread t2 = new Thread(() -> {
obj.myMethod();
});
t1.start();
t2.start();
```
在上述例子中,通过 synchronized 关键字修饰的 myMethod() 方法,确保了在同一时刻只有一个线程能够执行其中的互斥操作。其他线程需要等待锁的释放,才能继续执行。
需要注意的是,synchronized 锁住的是对象本身,而不是代码块或方法。因此,不同的对象实例之间是独立的,它们的锁是相互独立的。只有同一个对象的不同线程之间才会互斥访问。