synchronized 代码块 对this .class对象 成员对象 静态成员对象 加锁有什么区别,详细解释并给出代码示例
时间: 2024-02-26 18:58:24 浏览: 70
透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别
在 Java 中,synchronized 关键字可以用于不同的锁对象,包括 this 对象、类对象和成员对象。
1. 对于 this 对象加锁
当使用 synchronized(this) 时,锁对象是当前实例对象,即该实例的所有 synchronized 方法和 synchronized 代码块都会相互竞争同一把锁。这样的锁定范围是对象级别的,不同实例对象之间的锁是互不影响的。
下面是一个使用 synchronized(this) 的代码示例:
```
public class MyClass {
public synchronized void synchronizedMethod() {
// 代码块1
}
public void nonSynchronizedMethod() {
// 代码块2
synchronized (this) {
// 代码块3
}
}
}
```
在上述代码中,synchronizedMethod() 方法和 synchronized (this) 代码块都是锁定当前实例对象,即 MyClass 的实例对象。而 nonSynchronizedMethod() 方法中的 synchronized (this) 代码块也是锁定当前实例对象。
2. 对于类对象加锁
当使用 synchronized(MyClass.class) 时,锁对象是 MyClass 类对象,即该类的所有实例对象都会相互竞争同一把锁。这样的锁定范围是类级别的,所有实例对象之间的锁是相互影响的。
下面是一个使用 synchronized(MyClass.class) 的代码示例:
```
public class MyClass {
public static synchronized void synchronizedMethod() {
// 代码块1
}
public void nonSynchronizedMethod() {
// 代码块2
synchronized (MyClass.class) {
// 代码块3
}
}
}
```
在上述代码中,synchronizedMethod() 方法和 synchronized (MyClass.class) 代码块都是锁定 MyClass 类对象。而 nonSynchronizedMethod() 方法中的 synchronized (MyClass.class) 代码块也是锁定 MyClass 类对象。
3. 对于成员对象加锁
当使用 synchronized(memberField) 时,锁对象是成员对象,即该成员变量的所有实例对象都会相互竞争同一把锁。这样的锁定范围是成员对象级别的,不同实例对象之间的锁是互不影响的。
下面是一个使用 synchronized(memberField) 的代码示例:
```
public class MyClass {
private final Object lock = new Object();
public synchronized void synchronizedMethod() {
// 代码块1
}
public void nonSynchronizedMethod() {
// 代码块2
synchronized (lock) {
// 代码块3
}
}
}
```
在上述代码中,synchronizedMethod() 方法是锁定当前实例对象,而 synchronized (lock) 代码块则是锁定成员变量 lock。这里的 lock 可以是任意对象,只要保证所有实例对象共用同一把锁即可。
总的来说,使用 synchronized 关键字可以实现多线程的同步,不同的锁对象可以锁定不同的范围,根据实际需要选择合适的锁对象,有助于提高并发性能。
阅读全文