在java多线程编程中,最被经常用到的便是wait与notfiy方法,这两个方法可以用来更加精确地控制被同步的代码,从而使得被同步的代码最小化,提高并发效率。
当某个类的某个方法被标记为synchronized时,这个方法在同一时间只能被一个线程访问。此时这个方法中的所有代码都是被同步的,只有当一个线程执行完所有的代码之后,下一个线程才能开始执行。当被同步的方法代码量比较小,而且每一步执行都非常快的时候仅仅使用synchronized关键字就够了。但是,如果被同步的方法里面有一些代码是可以被共享的,而且这些能够被共享的代码里面存在比较耗时的操作时,仅仅使用synchronized关键字就无法达到最高的效率,这个时候可以使用wait与notify方法来对并发访问做更进一步的控制。首先看两段代码:
public class TestThread {
private boolean isIdle = true;
public synchronized void work(){
/*
* Some work which can be shared
*/
try {
/*
* to check if we can have this object's monitor
*/
if(!isIdle){
System.out.println(Thread.currentThread().toString() + ":I'm waiting....");
}
while(!isIdle){
wait();
}
/*
* to set isIdle to false, I'm working....
*/
this.isIdle = false;
System.out.println(Thread.currentThread().toString() + ":I'm working....");
Thread.currentThread().sleep(1000);
System.out.println(Thread.currentThread().toString() + ":I'm finished....");
/*
* to notify all other thread which is waiting for this object's monitor
*/
this.isIdle = true;
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的类中定义了一个方法work,在这个方法中的try块之前可以执行一些可共享的代码,而try块中的代码是不能够被共享的。因此,我们在进入try之后会首先判断标志isIdle是否为true,如果为true就表示当前没有其他线程正在访问,因此当前线程就获得了执行try块中代码的权利。在执行代码前当前线程会将isIdle设置成false,这样当其他线程进入try,之后就会发现isIdle为false,从而进入等待状态。
当一个线程执行完try中的代码之后,会将isIdle重新设置为true,同是使用notifyAll方法通知所有等待获得执行try块中代码的权利的线程。
下面这个类用来测试上面的TestThread:
public class ThreadTester {
private static TestThread tt = new TestThread();
public static void main(String[] args){
for(int i = 0; i < 5; i++){
new Thread(new Runnable(){
public void run(){
tt.work();
}
}).start();
}
}
}
这个类在main方法中启动了五个不同的线程来访问TestThread的work方法,从打印的结果中可以看出,每次线程的执行顺序都会有些许的差别。
日志:
第一次运行:
Thread[Thread-0,5,main]:I'm working....
Thread[Thread-0,5,main]:I'm finished....
Thread[Thread-1,5,main]:I'm working....
Thread[Thread-1,5,main]:I'm finished....
Thread[Thread-3,5,main]:I'm working....
Thread[Thread-3,5,main]:I'm finished....
Thread[Thread-2,5,main]:I'm working....
Thread[Thread-2,5,main]:I'm finished....
Thread[Thread-4,5,main]:I'm working....
Thread[Thread-4,5,main]:I'm finished....
第二次运行:
Thread[Thread-0,5,main]:I'm working....
Thread[Thread-0,5,main]:I'm finished....
Thread[Thread-2,5,main]:I'm working....
Thread[Thread-2,5,main]:I'm finished....
Thread[Thread-1,5,main]:I'm working....
Thread[Thread-1,5,main]:I'm finished....
Thread[Thread-4,5,main]:I'm working....
Thread[Thread-4,5,main]:I'm finished....
Thread[Thread-3,5,main]:I'm working....
Thread[Thread-3,5,main]:I'm finished....
分享到:
相关推荐
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
在Java中,`wait()`、`notify()`和`notifyAll()`方法都是与对象锁相关的,它们用于控制线程的同步。使用这些方法的前提是线程必须拥有对象的监视器,也就是对象锁。这是通过在synchronized块或方法中调用它们来实现...
在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...
Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...
本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...
在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...
wait()、notify()和notifyAll()方法1---马克-to-win java视频
wait()、notify()和notifyAll()方法2---马克-to-win java视频
JAVAWAIT和NOTIFY的用法.pdf
在Java中,使用`wait()`, `notify()`, 和 `notifyAll()`必须在同步块或者同步方法中,因为它们涉及到对共享资源的访问。这是为了避免出现竞态条件,确保只有一个线程在执行这些操作。 主线程控制子线程的`wait()`和...
源码—Java多线程5—死锁和wait notify notifyAll
Java 线程保护性暂停(wait,notify 实现) ...本文详细讲解了 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现,并提供了一个实际的示例代码,演示如何使用保护性暂停机制来实现线程之间的通信。
- **权限和锁**:`wait()`, `notify()`和`notifyAll()`需要在同步上下文中使用,而`sleep()`则不需要。 - **资源释放**:`wait()`会释放对象锁,而`sleep()`不会。 - **唤醒机制**:`wait()`需要其他线程调用`notify...