java unpark_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 voidnotify();/*** 解释:让当前线程去等待,知道当前其他的线程, 并且 当前线程 必须是monitor的拥有者

*

*  1) 如果超时 throw IllegalArgumentException

*  2) 如果当前线程没有拥有这个Objeect的 monitor throw IllegalMonitorStateException

*  3) 如过当前线程在wait 这个线程被interrrupt 那么 会 throw InterruptedException

* @Paramtimeout 最大等待时间 (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, longtime);/** 释放被park创建的在一个线程上的阻塞.这个

* 方法也可以被使用来终止一个先前调用park导致的阻塞.

* 这个操作操作时不安全的,因此线程必须保证是活的.这是java代码不是native代码。*/

public native void unpark(Thread thread);

下面的代码 会阻塞在 a.wait()

public static void main(String[] args) throwsException{

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 相对应

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值