java 之 wait, notify, park, unpark , synchronized, Condition
1. wait notify
/**
* 解释: 唤醒一个等待monitor的线程, 如果有多个线程在等待,会唤醒一个。
* 一个线程在等待monitor是由Object.wait引起的
* 获取一个类的monitor方法有三种
* 1) 执行该类具有synchronizes 的实例方法
* 2) 执行该类具有synchronizes 的静态方法
* 3) 代码同步块synchronizes(Object)
* 如果当前线程没有monitor那么将 throw IllegalMonitorStateException
*/
public final native void notify();
/**
* 解释:让当前线程去等待,知道当前其他的线程, 并且 当前线程 必须是monitor的拥有者
*
* 1) 如果超时 throw IllegalArgumentException
* 2) 如果当前线程没有拥有这个Objeect的 monitor throw IllegalMonitorStateException
* 3) 如过当前线程在wait 这个线程被interrrupt 那么 会 throw InterruptedException
* @Param timeout 最大等待时间 (0 是无限长) 单位毫秒
*/
public final native void wait(long timeout) throws InterruptedException;
2.synchronized
一种 同步的 关键字 , 实现: 每个Object都有一个Monitor 也因此 synchronized 是基于这个monitor实现的 并发 安全, 同时 也有自旋 和 ReentLock差不多, 但是是JVM实现 看不到源码不wangjia评论。
3. park, unpark.
和 wait Notify 不同的是 他是 对线程而言的 , 而wait是Object的。 底层似乎是直接用的C的同步信号量
/* 阻塞一个线程直到出现、线程 被中断或者timeout时间到期。如果一个unpark调用已经出现了,
* 这里只计数。timeout为0表示永不过期.当isAbsolute为true时 timeout是相对于新纪元之后的毫秒。否则这个值就是超时前的纳秒数。
* 这个方法执行时也可能不合理地返回(没有具体原因)
*/
public native void park(boolean isAbsolute, long time);
/*
* 释放被park创建的在一个线程上的阻塞.这个
* 方法也可以被使用来终止一个先前调用park导致的阻塞.
* 这个操作操作时不安全的,因此线程必须保证是活的.这是java代码不是native代码。
*/
public native void unpark(Thread thread);
下面的代码 会阻塞在 a.wait()
public static void main(String[] args) throws Exception{
Field f = Unsafe.class.getDeclaredField("theUnsafe"); //Internal reference
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
unsafe.unpark(Thread.currentThread());
unsafe.park(false, 0);
System.out.println("over");
Integer a = 1;
synchronized (a) {
a.notify();
}
synchronized (a) {
a.wait();
}
}
我们知道 synchronized Object.wait Object.notify 是一组
而 ReentrantLock 是和 ReentrantLock.Condition.await ReentrantLock.Condition.signal 相对应
java 之 wait, notify, park, unpark , synchronized, Condition的更多相关文章
- jdk提供的线程协调API suspend/resume wait/notify park/unpark
线程通信(如 线程执行先后顺序,获取某个线程执行的结果等)有多种方式: 文件共享 线程1 --写入--> 文件 < --读取-- 线程2 网络共享 变量共享 线程1 --写入--> ...
- JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)
一.前言 在多线程的场景下,我们会经常使用加锁,来保证线程安全.如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题.也可以使用Condition的awai ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发--线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- 006 Java并发编程wait、notify、notifyAll和Condition
原文https://www.cnblogs.com/dolphin0520/p/3920385.html#4182690 Java并发编程:线程间协作的两种方式:wait.notify.notifyA ...
- java wait和notify及 synchronized sleep 总结
java 中线程我一直弄不清线程锁等 所以写了一些例子验证看法: 在这之前先看下API中wait中的解释: wait:方法来之java.lang.Objetc 方法翻译:在其他线程调用此对象的 not ...
- 转:JAVA 的wait(), notify()与synchronized同步机制
原文地址:http://blog.csdn.net/zyplus/article/details/6672775 转自:https://www.cnblogs.com/x_wukong/p/40097 ...
- JAVA 的wait(), notify()与synchronized同步机制
转自:http://blog.csdn.net/zyplus/article/details/6672775 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过syn ...
随机推荐
- hosts 文件与 ipv6
ipv6 的项目地址:ipv6-hosts 正如文档中所说,用于在大陆地区加快 Google.YouTube.Facebook.Wikipedia 等的访问:(twitter 不支持) 使用说明(wi ...
- oracle之dbms_output
oracle的dbms_output oracle的dbms_output的两个小问题 .如果dbms_output.put_line的内容不能显示,需要在命令行中先敲入set serveroutpu ...
- ES6学习笔记(六)数组的扩展
1.扩展运算符 1.1含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) // ...
- JS 中 this 与闭包的结合产生的问题
代码片段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : ...
- struts2的字符串参数
一定要熟记一个东西,一层引号的是变量,两层引号的是字符串 如"蓝"/'蓝'是变量,而" '蓝' "/ ' "蓝" '是字符串 打代码时要警惕 ...
- Justinmind使用教程(5)——Justinmind破解
今天继续用Justinmind的时候.提示快到期啦. 所以今天学习的课题比較简单了,就是怎样破解Justinmind. 眼下没有无敌的注冊码,大家依照例如以下方式操作一定就解决全部问题了 1.删除两个 ...
- 如何分解json值设置到text文本框中
<td><input type="text" id="name11"></td> //4设置访问成功返回的操作 xhr.on ...
- ElasticSearch概述和定义
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- SqlDatasource简单用法
http://blog.csdn.net/zxf1by1/article/details/7055015 增删改查和前台页面(拖拽过来的,但是包含参数的)
- C#开发 —— 异常处理
System.ArithmeticException 在算术运行期间发生异常 System.ArrayTypeMismatchException 存储元素的实际类型与数组的实际类型不兼容而导致存储失败 ...