Java所有的类都具有线程的潜力,Java赋予的每个对象一个锁,在计算机内部工作在同一时间,只有一个对象可以持有锁,也就是说程序在同一时间只有一个程序可以运行,这里我把对象比作是一个小的程序。而多处理器,那么就另当别论了。
在这里我们首先学习一下公共方法wait,notify,notifyAll。
wait方法可以使在当前线程的对象等待,直到别的线程调用此对象的notify或notifyAll方法(注意:调用的是此对象的notify和notifyAll),并且当前运行的线程必须具有此对象的对象监视器,对象监视器我们可以从三个方法中获得,如下:
1.在执行对象实例同步方法体中,可以获得此对象的对象监视器,例子伪代码如下:
synchronized void aMethod(){
while(condition)
this.wait();
//other mothed;
}
2.通过执行对象同步synchronized正文,例子伪代码如下:
synchronized(this){
while(condition)
this.wait();
//other mothed;
}
3.对于 Class
类型的对象,可以通过执行该类的同步静态方法
这个方法可以使当前对象满足条件condition后,执行等待,当前线程对象放弃锁,cpu记录当前线程状态,以备下次回复。然后让其他线程运行,直到其他线程调用此对象的notify或notifyAll方法,此对象才会重新获得此对象的对象监视器,此对象才能重新运行。
注意:调用这个方法,必须具有对象监视器,也就是说我们必须在这三种方法选一种来获得对象监视器,如果调用此方法wait,却没用对象监视器,那么运行时会抛出IllegalMonitorStateException.
而且,在静态方法中也无法获得对象监视器,只能在Class类型的对象中,我们才可以通过调用该类的同步静态方法来获得对象监视器。
分享到:
相关推荐
主要介绍了Object类wait及notify方法原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
以下是对java中Object.wait()与Object.notify()的用法进行了详细的分析介绍,需要的朋友可以过来参考下
1.这两个方法来自不同的类,sleep是Thread类的方法,而wait是Object类的方法; 2.执行sleep方法后不会释放锁,而执行wait方法后会释放锁; 3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以...
创建多个condition对象 ...Condition类的awiat方法和Object类的wait方法等效 Condition类的signal方法和Object类的notify方法等效 Condition类的signalAll方法和Object类的notifyAll方法等效
并发编程的一些小示例 1.等待通知的几种方式,包括Object的wait/notify,Condition的await/signal 2. CountDownLatch,统一控制多线程开始和结束 3.原子操作,AtomicXXX 4.线程池
为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么 String str="i"与 String str=new String("i")一样吗 用过ConcurrentHashMap,...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。) sleep...
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
共享数据的状态并不一定满足线程的需要,它要等待其他线程将共享数据改变为它需要的状态后才能继续执行,但由于此时它占有了该对象的锁,其他线程无法对共享数据进行操作,为此Java引入wait()和notify(),...
重入锁ReentrantLock 相对来说是synchronized、Object.wait()和Object.notify()方法的替代品(或者说是增强版),在JDK5.0的早期版本,重入锁的性能远远好于synchronized,但从JDK6.0开始,JDK在synchronized上做了...
20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26、ArrayMap和HashMap的对比 29、HashMap和HashTable的区别 30、HashMap与HashSet的区别 31-40题 31、HashSet与HashMap...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...
注意:上述方法只能被同步监听锁对象来调用,这也是为啥wait() 和 notify()方法都在 Object 对象中,因为同步监听锁可以是任意对象,只不过必须是需要同步线程的共同对象即可,否则别的对象调用会报错: java.lang...
只有当别的线程在该对象上调用了 notify()或者notifyAll()方法,"Wait Set"队列中的线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。"Wait Set"中的线程在Thread Dump中显示的状态为 in ...
Object.wait()和LockSupport.park()的区别 线程和线程池 线程池的五种状态 线程池类型 线程池原理 线程池构造函数参数; 线程池的4种拒绝策略; 线程池中任务结束后会不会回收线程; 线程有哪几种创建方式; ...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...
趣解Thread和Object类中线程相关方法:wait、notify、join、yield… 线程属性 线程异常处理 线程安全与程序性能的取舍之道 ... 3 环境参数 Maven 3.6+ JDK 8+ Tomcat 8.5+ MySQL 8.0.16+ Redis 6.0+ Intellij IDEA ...
使用object对象自带的wait和notify方法实现了互斥。 2.3 :BlockingQueueExample 使用LinkedList 实现了带有 阻塞的put 和 take 方法的 阻塞队列BlockingQueueExample,这个类只能存放object的对象。默认队列大小为...