这几个用法是很多公司都考的问题,下面再复习一下
package test;
public class MyThread extends Thread {
public static Object lock = new Object() ; //全局的锁,在这用来说明问题
public static int i = 0 ;
public void run(){
synchronized(lock){ //这里同步,如果没有释放锁,其他线程是不会进去执行println语句的
i++ ;
int prev = i ; //用于看是那个线程,局部变量保存在线程栈中
System.out.println("before i = " + i);
try {
lock.wait(); //这里,如果wait不释放锁,其他线程不可能进入打印出“before i =” 信息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
System.out.println( prev + " after i = " + i);
}
}
}
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0 ; i < 5 ; i++){
MyThread th = new MyThread();
th.start();
}
try {
Thread.currentThread().sleep(2000); //这里睡眠,让线程先都开始跑
System.out.println("end");
synchronized(MyThread.lock){
MyThread.lock.notifyAll();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
before i = 1
before i = 2
before i = 3
before i = 4
before i = 5
end
5 after i = 6
4 after i = 7
3 after i = 8
2 after i = 9
1 after i = 10
由上面的输出结果可以看出,打印"end",也就是notifyAll()之前,在lock.wait时候,释放了锁,所以其他线程可以进入同步块,输出了 “before i = ” 信息。
上面的wait和notifyAll,如果没有synchronized块,运行时候会抛出IllegalMonitorStateException。
分享到:
相关推荐
### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...
需要注意的是,`wait()`, `notify()`, 和 `notifyAll()` 必须在同步上下文中(synchronized代码块或方法)调用,否则会抛出`IllegalMonitorStateException`异常。此外,调用这些方法的线程必须是拥有对象锁的线程,...
使用`wait()`的一个关键前提是在`synchronized`代码块中调用,以确保在释放锁的同时保持线程同步。 #### `notify()` `notify()`方法随机唤醒正在等待该对象锁的线程之一。被唤醒的线程将有机会重新获取锁并继续...
Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...
3. 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 4. wait() 需要被try catch包围,中断也可以使wait等待的线程唤醒。 5. notify 和wait 的顺序不能错,如果A线程先...
Java提供了一套基于对象监视器机制的线程通信方式,其中包括`wait()`、`notify()`和`notifyAll()`方法。这些方法都是在`java.lang.Object`类中定义的,因此所有Java对象都具备这些功能。本篇将详细介绍如何使用`wait...
下面,我们将从`synchronized`的基本概念、使用方式以及与`wait`和`notify`方法的关系几个方面进行详细阐述。 ### 一、`synchronized`关键字的基本概念 `synchronized`是Java语言中提供的关键字,用于控制线程的...
1. **锁的持有**:调用`wait()`, `notify()`, 或 `notifyAll()` 必须在同步块(`synchronized` block)或同步方法中进行,即当前线程必须持有对象的锁。否则,会抛出`IllegalMonitorStateException`异常。这是因为这些...
除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...
`synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...
`synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...
通过`wait()`、`notify()`和`notifyAll()`方法,线程可以在同步块中进行等待和唤醒操作。这些方法必须在`synchronized`代码块或方法中调用,否则会抛出`IllegalMonitorStateException`。 9. **Lock接口与`...
Java提供了`wait()`、`notify()`和`notifyAll()`方法来实现线程间的通信。这些方法必须在`synchronized`代码块或方法中调用,因为它们依赖于监视器(即对象的锁)来工作。 2. **BlockingQueue(阻塞队列)**:在...
wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
- 必须在同步代码块(synchronized block)或者同步方法中调用`wait()`,否则会抛出`IllegalMonitorStateException`。因为只有持有锁的线程才能调用`wait()`,否则会破坏线程同步的规则。 - 调用`wait()`后,线程...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
在深入探讨之前,我们先了解下`wait()`、`notify()`以及`notifyAll()`的基本概念。 ### `wait()` 方法 当一个线程执行到`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用同一锁上的`notify...