Synchronized关键字与wait、notify、notifyAll方法的关系与使用
发布时间: 2024-03-06 12:25:39 阅读量: 16 订阅数: 12 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
# 1. Synchronized关键字的基本概念和作用
在 Java 中,Synchronized 关键字是一种线程同步的机制,用于控制对共享资源的访问。通过对代码块或方法添加 Synchronized 关键字,可以确保在同一时刻只有一个线程可以访问被 Synchronized 修饰的代码块或方法,从而避免多个线程同时操作共享资源而导致数据不一致或产生错误。
#### 1.1 Synchronized关键字在Java中的作用及原理
Synchronized 关键字可以应用于实例方法、静态方法和代码块(对象锁和类锁)。在实例方法上加 Synchronized 关键字时,它锁的是对象实例;在静态方法上加 Synchronized 关键字时,它锁的是类的 Class 对象;在代码块上加 Synchronized 关键字时,需要指定一个对象作为锁。当线程进入 Synchronized 修饰的代码块时,会尝试获取锁,如果锁已被其他线程获取,则会被阻塞,直到获取到锁为止。
#### 1.2 Synchronized关键字的使用方法和注意事项
- 使用方法:通过在关键代码段前加上 Synchronized 关键字来实现同步。
- 注意事项:避免在 Synchronized 块中执行耗时操作,以免影响并发效率;避免在 Synchronized 块内部调用其他可能造成死锁的 Synchronized 方法;尽量减小 Synchronized 块的粒度,避免长时间持有锁。
在下文中,我们将详细探讨 wait、notify、notifyAll 方法与 Synchronized 关键字的协作,以实现多线程间的协同工作。
# 2. wait方法的功能和使用场景
在多线程编程中,wait方法是Object类中的一个实例方法,它用于使当前线程进入等待状态,同时释放对象监视器(锁),直到其他线程调用notify或notifyAll方法唤醒该线程。
### 2.1 wait方法的作用和含义
wait方法的主要作用是使当前线程进入等待状态,同时释放对象监视器(锁)。在调用wait方法之前,线程必须先获得对象的监视器,即在synchronized方法或synchronized块中调用wait方法。调用wait方法后,当前线程会进入对象的等待队列中,并且释放对象的锁。直到其他线程调用notify或notifyAll方法唤醒了这个等待的线程,该线程才能重新进入就绪状态,竞争对象的监视器。
### 2.2 wait方法与Synchronized关键字的配合使用
通常情况下,wait方法与Synchronized关键字一起使用,用于实现多线程之间的协作。在使用wait方法时,需要先通过Synchronized关键字获得对象的监视器,然后调用wait方法进入等待状态。
以下是一个简单的示例代码:
```java
public class WaitNotifyExample {
public synchronized void doWait() {
System.out.println("Thread is waiting...");
try {
wait(); // 调用wait方法,当前线程处于等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread is awakened...");
}
public synchronized void doNotify() {
notify(); // 唤醒在对象监视器上等待的单个线程
}
}
```
### 2.3 wait方法在多线程同步中的应用示例
下面我们通过一个生产者-消费者模式的示例来展示wait方法在多线程同步中的应用:
```java
public class WaitNotifyExample {
public static void main(String[] args) {
final Object lock = new Object();
Thread producer = new Thread(new Producer(lock));
Thread consumer = new Thread(new Consumer(lock));
producer.start();
consumer.start();
}
static class Producer implements Runnable {
private final Object lock;
Producer(Object lock) {
this.lock = lock;
}
public void run() {
synchronized (lock) {
// 生产物品
System.out.println("Producer is producing...");
// 通知消费者可以消费
lock.notify();
}
}
}
static class Consumer implements Runnable {
private final Object lock;
Consumer(Object lock) {
this.lock = lock;
}
pu
```
0
0
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)