最近在项目中运用多线程比较多,对synchronized,wait(),notify(),做了一些实验。
1、针对方法的synchronized实际上是对该对象加锁。
package com.test.wait_notify;
/**
* 锅巴
* 描述
* @version 1.0 2010-8-10
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
(new Thread(new MyThread(main))).start();
Thread.sleep(1000);
main.test2();
}
public synchronized void test3() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test3()");
notify();
wait();
}
public synchronized void test2(){
for(int i=0; i<10; i++){
System.out.println(Thread.currentThread().getName() + " test2()");
}
}
public synchronized void test1() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test1() start");
//wait();
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + " test1() end");
}
}
class MyThread implements Runnable{
private Main main;
public MyThread(Main main){
this.main = main;
}
public void run() {
// TODO Auto-generated method stub
try {
main.test1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
Thread-0 test1() start
Thread-0 test1() end
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
MyThread.run中调用synchronized void test1() ,这时对main对象加锁
main.test2()要等待main锁释放。
结论:当某线程调用某synchronized 修饰的方法时,会对该对象加锁。其他对象在调用其他synchronized 修饰方法时要等该获得该对象锁。
2、wait(),notify(),notifyAll() 必须在 synchronized 修饰内才有用。
3、wait()是让线程等待,放弃执行权力,并释放锁。
/**
* 锅巴
* 描述
*
* @version 1.0 2010-8-10
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
(new Thread(new MyThread(main))).start();
(new Thread(new MyThread(main))).start();
(new Thread(new MyThread(main))).start();
Thread.sleep(1000);
main.test2();
Thread.sleep(1000);
main.test3();
main.test3();
main.test3();
}
public synchronized void test3() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test3()");
notify();
}
public synchronized void test2(){
for(int i=0; i<10; i++){
System.out.println(Thread.currentThread().getName() + " test2()");
}
}
public synchronized void test1() throws InterruptedException{
System.out.println(Thread.currentThread().getName() + " test1() start");
wait();
System.out.println(Thread.currentThread().getName() + " test1() end");
}
}
class MyThread implements Runnable{
private Main main;
public MyThread(Main main){
this.main = main;
}
public void run() {
// TODO Auto-generated method stub
try {
main.test1();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果
Thread-0 test1() start
Thread-2 test1() start
Thread-1 test1() start
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test2()
main test3()
main test3()
main test3()
Thread-0 test1() end
Thread-1 test1() end
Thread-2 test1() end
在各线程调用main.test1()时碰到wait(),休眠并释放锁,其他线程可以进入。
main.test2()在各线程都wait()时调用
分享到:
相关推荐
需要注意的是,`wait()`, `notify()`, 和 `notifyAll()` 必须在同步上下文中(synchronized代码块或方法)调用,否则会抛出`IllegalMonitorStateException`异常。此外,调用这些方法的线程必须是拥有对象锁的线程,...
Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...
在实际应用中,我们通常使用 `synchronized` 关键字来确保对共享资源的访问是互斥的,同时保证 `wait()` 和 `notify()` 操作的正确性。下面是一个简单的例子,展示了如何通过 `wait()` 和 `notify()` 控制子线程的...
`wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...
在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...
在调用wait()之前,线程必须已经获取了对象的锁,即wait()、notify()和notifyAll()都必须在`synchronized`代码块或方法中。 2. **notify()**: notify()方法用于唤醒一个正在等待同一对象监视器锁的线程。如果有多...
标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...
在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...
本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...
在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...
### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...
总结来说,Java的多线程设计中的wait/notify机制结合`synchronized`关键字,提供了高效且灵活的线程间协作方式,使得多个线程能够协同工作,有效管理共享资源。在实际开发中,正确理解和使用这些机制对于编写健壮的...
问题4涉及到对象监视器的使用,即synchronized关键字和wait/notify方法。在给定的代码中,同步块内的wait()调用会导致当前线程等待,而notify()则会唤醒一个等待在同一对象上的线程。如果对象的监视器没有被正确...
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
- 如果wait()带有超时参数,除了notify/notifyAll外,线程还会在超时后被激活,或者被其他线程中断。 2. **notify()和notifyAll()方法**: - notify()方法会唤醒一个正在等待该对象锁的线程,但不保证是哪个线程...
3. 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 4. wait() 需要被try catch包围,中断也可以使wait等待的线程唤醒。 5. notify 和wait 的顺序不能错,如果A线程先...
_java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地...
在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...
其中,Java代码主要运用了Threadlocal、策略模式、动态代理、静态代理、单例模式(包括懒汉式、饿汉式、加锁懒汉式、双重判定锁)、volatile关键字、synchronized关键字、wait/notify/notifyAll机制、join方法来保证...