`
xieyj
  • 浏览: 102709 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

synchronized、wait、notifyAll学习

阅读更多

  这几个用法是很多公司都考的问题,下面再复习一下

 

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方法的使用示例

    ### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...

    Java 同步方式 wait和notify/notifyall

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

    Java 同步锁 wait notify 学习心得

    使用`wait()`的一个关键前提是在`synchronized`代码块中调用,以确保在释放锁的同时保持线程同步。 #### `notify()` `notify()`方法随机唤醒正在等待该对象锁的线程之一。被唤醒的线程将有机会重新获取锁并继续...

    Java 中Object的wait() notify() notifyAll()方法使用

    Java 中Object的wait() notify() notifyAll()方法使用 在Java并发编程中,Object的wait()、notify()和notifyAll()方法是非常重要的概念,这三个方法都是Object类的方法,可以认为任意一个Object都是一种资源(或者...

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

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

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

    本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...

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

    3. 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 4. wait() 需要被try catch包围,中断也可以使wait等待的线程唤醒。 5. notify 和wait 的顺序不能错,如果A线程先...

    Java通过wait()和notifyAll()方法实现线程间通信

    Java提供了一套基于对象监视器机制的线程通信方式,其中包括`wait()`、`notify()`和`notifyAll()`方法。这些方法都是在`java.lang.Object`类中定义的,因此所有Java对象都具备这些功能。本篇将详细介绍如何使用`wait...

    synchronized 的理解

    下面,我们将从`synchronized`的基本概念、使用方式以及与`wait`和`notify`方法的关系几个方面进行详细阐述。 ### 一、`synchronized`关键字的基本概念 `synchronized`是Java语言中提供的关键字,用于控制线程的...

    Java的wait(), notify()和notifyAll()使用心得

    1. **锁的持有**:调用`wait()`, `notify()`, 或 `notifyAll()` 必须在同步块(`synchronized` block)或同步方法中进行,即当前线程必须持有对象的锁。否则,会抛出`IllegalMonitorStateException`异常。这是因为这些...

    synchronized并发讲解源码.zip

    除了锁住对象或类,`synchronized`还可以与`wait()`、`notify()`和`notifyAll()`方法结合使用,实现复杂的线程通信和同步。这些方法都是在`Object`类中定义的,只有在持有对象锁的情况下才能调用,否则会抛出`...

    synchronized用法大全实例

    `synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    java synchronized详解

    通过`wait()`、`notify()`和`notifyAll()`方法,线程可以在同步块中进行等待和唤醒操作。这些方法必须在`synchronized`代码块或方法中调用,否则会抛出`IllegalMonitorStateException`。 9. **Lock接口与`...

    生产者消费者Java—synchronized 机制

    Java提供了`wait()`、`notify()`和`notifyAll()`方法来实现线程间的通信。这些方法必须在`synchronized`代码块或方法中调用,因为它们依赖于监视器(即对象的锁)来工作。 2. **BlockingQueue(阻塞队列)**:在...

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

    wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...

    wait()编程wait()编程wait()编程wait()编程

    - 必须在同步代码块(synchronized block)或者同步方法中调用`wait()`,否则会抛出`IllegalMonitorStateException`。因为只有持有锁的线程才能调用`wait()`,否则会破坏线程同步的规则。 - 调用`wait()`后,线程...

    wait_notify_demo

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

    java中几个notify、wait使用实例

    在深入探讨之前,我们先了解下`wait()`、`notify()`以及`notifyAll()`的基本概念。 ### `wait()` 方法 当一个线程执行到`wait()`方法时,它会释放当前持有的锁并进入等待状态,直到其他线程调用同一锁上的`notify...

Global site tag (gtag.js) - Google Analytics