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 ...
随机推荐
- centos 7.3 配置vnc 服务 图形界面登录
1.检查系统是否有安装tigervnc-server软件包 rpm -qa |grep vnc 默认的系统未装tigervnc-server软件包 2.安装tigervnc-server软件包 yum ...
- SOAPUI使用
简介:在开发接口的时候每次验证接口是否正确都需要手动写测试DEMO来验证,使用SOAPUI可以大大减少测试时间. 目录 1.SOPUI介绍... 1 2.SOAPUI使用... 1 2.1新建SOAP ...
- easyUI表单验证
1.重写easyui中的 $.extend($.fn.validatebox.defaults.rules, { }) 2.长度重写的方式 1 $.extend($.fn.validatebox.de ...
- OpenSUSE42.3 leap 软件源设置
一.OpenSUSE软件源介绍: 1.默认已经加入了官方的软件源,不过我们自己也可以根据需要添加很多非官方软件源,添加软件源时要注意: 非官方源可能包含一些试验中的不稳定的软件包 不同的软件源之 ...
- CentOS桥接网卡配置
网桥方式配置步骤 1.增加网桥设备br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge B ...
- Android布局之RelativeLayout
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...
- [Python] Wikipedia Crawler
import time import urllib import bs4 import requests start_url = "https://en.wikipedia.org/wiki ...
- 用c#编写爬虫在marinetraffic下载船仅仅图片
近期在做船仅仅识别方面的事情,须要大量的正样本来训练adaboost分类器. 于是到marinetraffic这个站点上下载船仅仅图片.写个爬虫来自己主动下载显然非常方便. 站点特点 在介绍爬虫之前首 ...
- 57.NodeJS入门--环境搭建 IntelliJ IDEA
转自:https://blog.csdn.net/wang19891106/article/details/51127133 NodeJS入门–环境搭建 IntelliJ IDEA 本人也刚开始学习N ...
- 71.lambda表达式的递归
#include <iostream> #include <functional> using namespace std; void main() { //&调用外部 ...