wait() notify() notifyAll() 多线程(4)

1.volatile关键字:建立了一个内存屏障 防止重排序,
线程内部,自己看起来全是有序的, 但是为了性能优化,jvm,cpu都是进行了重排序的
这些指令在其他线程看起来,全是乱序的;

2.wait(),notify(), notifyAll(),(doushin )都是用在synchronized同步块里面使用,编译会通过,但在外面使用会抛异常

3.锁对象.wait(),作用在锁对象  调用wait的对象一定是被锁定的,不管是在当前线程锁定还是其他线程 
wait()和notify是针对某个对象,是类Object的方法,并且保证synchronize,wait和notify针对的是同
一个具体对象
wait()后,该线程处于阻塞状态,当前线程释放这把锁

4.wait可以被notify唤醒,也可以中断,sleep不能唤醒,但是可以被中断
不能用this.wait();

synchronized(object){
     object.wait();第二行
}

5.线程获取这把锁,然后等待,放弃这把锁,阻塞,等待被唤醒,
其他线程来竞争这把锁  同样进来后释放阻塞等待被唤醒

6.wait搭配notify可以用在线程间的通信,但是
notify是唤醒调用对象的锁,由其他线程竞争这把锁。但是在释放这把锁之前,要先让剩余代码块执行完
等待同步代码块执行完,才释放这把锁,才让其他线程去竞争
notifyAll是唤醒所有的当时在等待的锁,让其他线程去竞争 但是系统也只让一个线程去获得

7.超时等待  给wait()一个参数超时等待  wait一定释放锁,如果会给时间参数,在时间范围内唤醒,会继续执行,时间到了也会继续执行,会重新与其他线程竞争获取,获取锁, 如果时间参数给了0,则不考虑实时,线程等待直到通知
sleep不管锁的事,只是休眠一段时间继续,sleep不释放锁

8.

四种阻塞:

等待队列: join() sleep()  wait()

同步队列:synchronized(同步互斥阻塞)所有的线程竞争这把锁,竞争失败进入同步队列
(被关起来,这些线程被锁定)等待,  一直等待锁被释放(线程执行完或者wait释放锁)
 锁定的是线程,锁是对象锁,没有锁的线程被锁定所有在同步队列中,由某个对象锁定的线程,
在满足一定条件(锁被释放),所有满足条件的线程都会出队列来竞争这把锁。
当同步代码块时间很短,很快执行,很快竞争,对性能消耗很大
但是等待队列对时间消耗很少

9

等待队列的阻塞方法,对系统及CPU资源的 消耗可以说忽略不计 (类似排队)

synchronized使用,在某些情况下,比如非常多的线程执行时间非常短的代码,这种时候会不停的让很多的线程进出队列及
竞争锁这种情况对资源的消耗比较大(以后做多线程优化的前提条件)(大家去抢锁)


10.notify是唤醒一个线程,但是具体唤醒哪个线程不能保证,取决于线程调度器

notifyAll是等待该锁得到所有线程被唤醒,然后他们去争夺锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值