`
锅巴49
  • 浏览: 163971 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

synchronized及wait()/notify()的一些实验

阅读更多

最近在项目中运用多线程比较多,对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()时调用

 

1
0
分享到:
评论

相关推荐

    Java 同步方式 wait和notify/notifyall

    需要注意的是,`wait()`, `notify()`, 和 `notifyAll()` 必须在同步上下文中(synchronized代码块或方法)调用,否则会抛出`IllegalMonitorStateException`异常。此外,调用这些方法的线程必须是拥有对象锁的线程,...

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    Java多线程wait和notify

    在实际应用中,我们通常使用 `synchronized` 关键字来确保对共享资源的访问是互斥的,同时保证 `wait()` 和 `notify()` 操作的正确性。下面是一个简单的例子,展示了如何通过 `wait()` 和 `notify()` 控制子线程的...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    wait,notify等线程知识.pdf

    在调用wait()之前,线程必须已经获取了对象的锁,即wait()、notify()和notifyAll()都必须在`synchronized`代码块或方法中。 2. **notify()**: notify()方法用于唤醒一个正在等待同一对象监视器锁的线程。如果有多...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

    深入理解Wait、Notify和Wait与sleep区别

    本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

    java多线程设计wait[参考].pdf

    总结来说,Java的多线程设计中的wait/notify机制结合`synchronized`关键字,提供了高效且灵活的线程间协作方式,使得多个线程能够协同工作,有效管理共享资源。在实际开发中,正确理解和使用这些机制对于编写健壮的...

    Sun Certified Programmer for the Java 2 Platform(310-065)

    问题4涉及到对象监视器的使用,即synchronized关键字和wait/notify方法。在给定的代码中,同步块内的wait()调用会导致当前线程等待,而notify()则会唤醒一个等待在同一对象上的线程。如果对象的监视器没有被正确...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    - 如果wait()带有超时参数,除了notify/notifyAll外,线程还会在超时后被激活,或者被其他线程中断。 2. **notify()和notifyAll()方法**: - notify()方法会唤醒一个正在等待该对象锁的线程,但不保证是哪个线程...

    Java多线程中wait、notify、notifyAll使用详解

    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的使用,帮助读者更好地...

    java-wait和notify的用法.pdf

    在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...

    基于Java多线程与设计模式的2310服务架构优化源码

    其中,Java代码主要运用了Threadlocal、策略模式、动态代理、静态代理、单例模式(包括懒汉式、饿汉式、加锁懒汉式、双重判定锁)、volatile关键字、synchronized关键字、wait/notify/notifyAll机制、join方法来保证...

Global site tag (gtag.js) - Google Analytics