Java Object 对象上的wait(),notify(),notifyAll()方法理解

第一阶段理解(2017-7-27):

Java 将wait(),notify(),notifyAll()方法放在Object对象上,也就是说任何一个对象都可以调用这个方法,这与”任何一个对象都有一个内置锁,可以用于线程同步“是照应的。因此,当某个线程要释放cpu争夺权,让自己进入等待状态时,调用 某个锁(对象)上的wait()方法,也就是让当前线程等待其它线程调用该锁上的notify()或notify()方法。线程间通过同步锁来实现等待与唤醒协作。简单例子:

 1 package com.lyyc.thread.sample;
 2
 3
 4 import org.junit.Test;
 5
 6 public class ThreadStateSample {
 7
 8     @Test
 9     public void test() throws Exception {
10         int threadCount=10;
11         Action action=new Action();
12     Thread[] actions=new Thread[threadCount];
13     for(int i=0;i<threadCount;i++){
14         actions[i]=new Thread(action);
15         actions[i].start();
16     }
17
18     while(true){
19     for(Thread t:actions){
20         System.out.println(t.getName()+":"+t.getState());
21     }
22     Thread.sleep(2000);
23         synchronized (action.getLock()) { //首先的获得同步锁,才能调用该锁的wait()/notify()/notifyAll()方法
24             action.getLock().notifyAll(); //锁对象上调用notifyAll(),同志其它线程进入Runnable状态
25         }
26     }
27
28     }
29 }
30
31 class Action implements Runnable{
32
33     public Object lock=new Object();
34     public Object getLock(){
35         return lock;
36     }
37     @Override
38     public void run() {
39         try {
40             synchronized (lock) {
41                 Thread.sleep(2000);
42                 lock.wait();
43             }
44         } catch (InterruptedException e) {
45             // TODO Auto-generated catch block
46             e.printStackTrace();
47         }
48     }
49
50 }
51     
时间: 2024-12-28 20:54:56

Java Object 对象上的wait(),notify(),notifyAll()方法理解的相关文章

Java Object对象中的wait,notify,notifyAll的理解

wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态,在线程协作时,大家都会用到notify()或者notifyAll()方法,其中wait与notify是java同步机制中重要的组成部分,需要结合与synchronized关键字才能使用,在调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于synchronized(object){......}的内部才能够去调用ob

JAVA线程间协作:wait.notify.notifyAll

JAVA的进程同步是通过synchronized()来实现的,须要说明的是,JAVA的synchronized()方法相似于操作系统概念中的相互排斥内存块.在JAVA中的Object类型中.都是带有一个内存锁的,在有线程获取该内存锁后.其它线程无法訪问该内存.从而实现JAVA中简单的同步.相互排斥操作. 明确这个原理.就能理解为什么synchronized(this)与synchronized(static XXX)的差别了.synchronized就是针对内存区块申请内存锁,thiskeywo

Java多线程8:wait()和notify()/notifyAll()

轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件. 这样可以实现我们的需求,但是也带来了问题:CPU把资源浪费了B线程的轮询操作上,因为while操作并不释放CPU资源,导致了CPU会一直在这个线程中做判断操

Java多线程_wait/notify/notifyAll方法

关于这三个方法,我们可以查询API得到下列解释: wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完 notify():唤醒在此对象监视器上等待的单个线程 notifyAll():唤醒在此对象监视器上等待的所有线程 我们需要注意的点(1)wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写. (2)wait() 与 notify/notifyAll 方法必须在同步

Java Object 对象序列化和反序列化

Java Object 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但

Java Object 对象创建的方式 [ 转载 ]

Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建对象的方式: 1.构造器:用new语句创建对象,这是最常用的创建对象的方式. 2.反射:运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法. 3.克隆:调用对象的clone()方法. 4.序列化:运用反

Java Object 对象序列化后的文件格式

Java Object 对象序列化后的文件格式 @author ixenos 1.文件开头: AC ED 2.序列化格式版本示例: 00 05 3.字符串对象示例: 74 2字节表示的字符串长度 字符串: 74 00 05 ixenos 4.类序列化示例:当存储一个对象时,其类也被存储: 类名 序列化版本号ID指纹 序列化方法 数据域 72 2字节的类名长度 类名 8字节的指纹 1字节的标志 //由在java.io.ObjectStream.Constant中定义的三位掩码(三个字节常量)构成

Java之Object对象中的wait()和notifyAll()用法

用一个例子来说明Object对象中的wait方法和notifyAll方法的使用. 首先定义一个消息类,用于封装数据,以供读写线程进行操作: 1 /** 2 * 消息 3 * 4 * @author syj 5 */ 6 public class Message { 7 8 private String msg; 9 10 public String getMsg() { 11 return msg; 12 } 13 14 public void setMsg(String msg) { 15 t

java wait(),notify(),notifyAll()的理解

这个三个函数来自Object类,众所周知它们是用于多线程同步的.然而,有个问题却一直没搞清楚,即notify()函数到底通知谁?<Thinking in JAVA>中有这么一句话,当notify()函数因为某个特定锁被调用时,只有等待这个锁的任务才会被唤醒.什么意思? 看下面的代码,这个代码执行的话会报错,java.lang.IllegalMonitorStateException 上网查了一下,明白了. 1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>