- 浏览: 308869 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (405)
- linux (31)
- java (144)
- mysql (52)
- html (19)
- oracle (8)
- sql (12)
- 无题 (5)
- js (16)
- android (4)
- tomcat (4)
- struts (2)
- spring (12)
- elcipse (2)
- shell (7)
- interview (2)
- redis (6)
- apache (2)
- maven (10)
- mq (6)
- kengen (0)
- windows (3)
- css (1)
- nginx (2)
- google (1)
- zk (1)
- ibm (1)
- git (1)
- mvn (1)
- jms (1)
- uml (1)
最新评论
java Object 类中 notify() ,notifyAll() ,wait()
Java Monitor 从两个方面来支持线程之间的同步,即:互斥执行与协作。 Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行 , 使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。这些方法在 Object 类上被定义,会被所有的 Java 对象自动继承。
实质上,Java 的 Object 类本身就是监视者对象,Java 语言对于这样一个典型并发设计模式做了内建的支持。不过,在 Java 里,我们已经看不到了我们在 C++ 一节所讨论的区域锁与条件变量的概念。下图很好地描述了 Java Monitor 的工作机理。
线程如果获得监视锁成功,将成为该监视者对象的拥有者。在任一时刻内,监视者对象只属于一个活动线程 (Owner) 。拥有者线程可以调用 wait 方法自动释放监视锁,进入等待状态。
1. wait() 方法:
要调用一个对象的wait()方法,只有当前线程获取了这个对象的锁,换句话说一定要在这个对象的同步方法或以这个对象为参数的同步块中.当一个线程调用了wait() 方法后,这个线程就进入了这个对象的休息室(waitset),这是一个虚拟的对象,但JVM中一定存在这样的一个数据结构用来记录当前对象中有哪些程线程在等待。然后它就会释放锁,让其它线程来获取这个锁.
这个线程只能等待其它线程调用notity[All]来唤醒.
但是如果调用的是有参数的wait(time)方法,则线程会在休息室中等待这个时间后自动唤醒.
class Test{
public synchornized void test(){
//获取条件,int x 要求大于100;
while(x < 100) // 注意这里是while 每次被唤醒后,还是要检查条件是否满足
wait();
perform(); // 执行操作
}
}
2. notify() notifyAll() 方法:
这两个方法都是把某个对象上休息区内的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上的休息室中所有的线程.
一般为了保险起见,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程.
Java Monitor 从两个方面来支持线程之间的同步,即:互斥执行与协作。 Java 使用对象锁 ( 使用 synchronized 获得对象锁 ) 保证工作在共享的数据集上的线程互斥执行 , 使用 notify/notifyAll/wait 方法来协同不同线程之间的工作。这些方法在 Object 类上被定义,会被所有的 Java 对象自动继承。
实质上,Java 的 Object 类本身就是监视者对象,Java 语言对于这样一个典型并发设计模式做了内建的支持。不过,在 Java 里,我们已经看不到了我们在 C++ 一节所讨论的区域锁与条件变量的概念。下图很好地描述了 Java Monitor 的工作机理。

线程如果获得监视锁成功,将成为该监视者对象的拥有者。在任一时刻内,监视者对象只属于一个活动线程 (Owner) 。拥有者线程可以调用 wait 方法自动释放监视锁,进入等待状态。
1. wait() 方法:
要调用一个对象的wait()方法,只有当前线程获取了这个对象的锁,换句话说一定要在这个对象的同步方法或以这个对象为参数的同步块中.当一个线程调用了wait() 方法后,这个线程就进入了这个对象的休息室(waitset),这是一个虚拟的对象,但JVM中一定存在这样的一个数据结构用来记录当前对象中有哪些程线程在等待。然后它就会释放锁,让其它线程来获取这个锁.
这个线程只能等待其它线程调用notity[All]来唤醒.
但是如果调用的是有参数的wait(time)方法,则线程会在休息室中等待这个时间后自动唤醒.
class Test{
public synchornized void test(){
//获取条件,int x 要求大于100;
while(x < 100) // 注意这里是while 每次被唤醒后,还是要检查条件是否满足
wait();
perform(); // 执行操作
}
}
2. notify() notifyAll() 方法:
这两个方法都是把某个对象上休息区内的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上的休息室中所有的线程.
一般为了保险起见,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程.
发表评论
-
adfasdfsdf
2017-03-23 08:38 516package com.twsz.creative.elv ... -
经典技术书籍
2016-12-08 11:00 437这个列表包括了 100 多本经典技术书籍,涵盖:计算机系统 ... -
分割字符串
2016-11-18 18:57 517@Test public void test2() { ... -
BD音乐部分接口
2016-11-15 15:45 706歌曲ID 详细信息接口:http://tingapi.ti ... -
限速器
2016-09-30 16:28 508package test.date; import ... -
Maven SCOPE
2016-09-29 23:34 400在Maven的依赖管理中, ... -
Twitter snowFlake
2016-09-19 22:22 428package com.netty.test.netty4 ... -
Spring BOOT生成web项目
2016-08-29 17:46 821https://github.com/spring-pro ... -
获取IP地址
2016-08-29 17:31 594import java.net.Inet4Address; ... -
Java Performance Tuning Guide
2016-08-29 15:14 367http://java-performance.info/ ... -
Nexus
2016-08-26 00:51 4202、创建解压目录,并将apache-maven-3.0-b ... -
Chain
2016-08-25 12:25 369public static void main(Strin ... -
Spring Boot
2016-08-23 12:50 528package com; import org.sp ... -
JAVA Seriesization
2016-08-16 15:28 525http://www.th7.cn/Program/And ... -
字节码
2016-08-12 19:42 490http://www.blogjava.net/libin ... -
回调在JSMTemplate的位置
2016-08-11 21:55 334package test; public class ... -
原生activeMQ支持
2016-08-10 20:40 444http://www.cnblogs.com/xwdrea ... -
activeMQ
2016-08-09 13:06 407http://www.open-open.com/lib/ ... -
logback
2016-08-05 10:45 495logback logback.xml常用配置详解(二)& ... -
uml
2016-08-03 21:32 369UML建模语言7种图(以银行ATM系统为例) http: ...
相关推荐
Java中的`Object.wait()`、`Object.notify()`以及`Object.notifyAll()`是多线程编程中的核心方法,它们用于实现线程间的协作与通信。这些方法是`Object`类的最终原生(`final native`)方法,这意味着它们的实现位于...
在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这两个方法的区别以及它们在实际开发中的应用场景...
学习过程中经常遇见的异常集锦,大家不要错过啊,希望可以把到大家
Java还提供了wait()、notify()和notifyAll()方法用于线程间通信。这些方法必须在synchronized代码块内使用,确保线程安全。 ```java object.wait(); // 使当前线程等待 object.notify(); // 唤醒一个等待在object上...
**Tomcat安全规范详解** Tomcat作为一款广泛应用的开源Web服务器,因其高效的性能和良好的兼容性,被广大Web开发者所喜爱。然而,默认配置可能存在安全隐患,容易成为恶意攻击的目标。为了确保Tomcat的安全运行,...
`wait()`和`pulse()`方法是`java.lang.Object`类的一部分,它们是`Monitor`操作的关键组成部分,用于线程间的通信和协作。 `Monitor.wait()`方法的作用是让当前持有对象锁的线程暂停执行,释放持有的锁,并进入等待...
1. **类和接口**:手册详细列出了所有公共类和接口,如`java.lang.Object`(所有类的基类)、`java.util.ArrayList`(一种动态数组实现)和`java.io.File`(用于文件操作)。每个类或接口都有其构造函数、方法和字段...
Java中的`Object`类提供了`wait()`方法,这是Java多线程编程中一个至关重要的功能,它与`notify()`和`notifyAll()`一起用于线程间的协作。`wait()`方法主要用于实现线程的等待和唤醒机制,允许线程在特定条件下暂停...
* RUNNABLE -> TIMED_WAITING:当线程调用Object.wait(long timeout)方法时,线程从RUNNABLE状态转换到TIMED_WAITING状态。 * TIMED_WAITING -> RUNNABLE:当事件发生或时限到期后,线程从TIMED_WAITING状态转换到...
`wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间通信,但必须在同步环境中使用。 线程池是Java并发编程中的重要工具,`java.util.concurrent`包下的`ExecutorService`和`ThreadPoolExecutor`提供...
- `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它只能在同步块或同步方法中使用,因为它涉及到对象锁的管理。当一个线程调用对象的 `wait()` 方法时,它会释放当前对象的锁,然后进入该对象的等待池,...
#### 一、Thread.sleep()与Object.wait() 1. **Thread.sleep()** - `Thread.sleep()`方法可以让当前正在执行的线程暂停执行指定的时间(毫秒),然后继续执行。 - 此方法是`Thread`类的一个静态方法。 - 可以抛...
private final Object lock = new Object(); private Logger() {} public static Logger getInstance() { if (instance == null) { synchronized (lock) { if (instance == null) { instance = new Logger...
- **定时等待(Timed Waiting)**:线程处于有限期等待状态,如`sleep()`、`Object.wait(long timeout)`。 - **终止(Terminated)**:`run()`方法执行完毕或者因异常退出。 3. **线程同步** - **synchronized...
在Java 2 SDK 1.3版本之前,开发者需要手动处理线程和复杂的`Object.wait()`方法来实现定时任务,而Java定时器框架简化了这一过程。 `Timer`类是一个线程,它负责调度`TimerTask`实例。`TimerTask`是一个抽象类,你...
而等待是线程主动通过调用`Thread.sleep()`或`Object.wait()`进入的。 二、使用线程 Java提供了三种创建和使用线程的方式: 1. 实现`Runnable`接口:需要实现`run()`方法,并通过`Thread`实例化并调用`start()`...
Java源码阅读之java.lang.Object Java中的Object类是所有类的父类,任何类都默认继承Object。Object类提供了多种方法,以下是其中一些重要的方法: 1. clone方法:保护方法,实现对象的浅复制,只有实现了...
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.... 3.... 4....对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8.停止,Parked
- 等待(Waiting):线程通过`wait()`、`join()`或`Object.wait()`进入无限期等待状态。 - 定时等待(Timed Waiting):线程通过`sleep()`, `join(long timeout)`或`Object.wait(long timeout)`进入有限期等待状态...