volatile关键字和wait、notify用法
·
一、volatile关键字

这个代码逻辑是先让t1线程死循环,通过t2线程对count进行修改,让循环结束,但是修改发现,程序并没有结束。这是因为while(count==0){}这一步在CPU上分为两个指令:从内存上读取数据,进行比较(纯寄存器操作)。而在计算机中速度排行是:cpu>内存>硬盘>网卡(万兆网卡比普通机械硬盘快),所以整个操作最慢的是从内存上读取数据,CPU为优化,会将内存上经常用到且不怎么改变的变量值存在缓存上,提高速度。这就意味着在内存上对count进行更改,CPU不应定反应过来。这会导致线程安全问题。

在循环中加sleep加少循环次数,让操作不那么频繁,会避免优化机制的发生,但是会让程序变慢,Java中提供了volatile关键字来禁止编译器的优化操作

二、wait、notify用法
我们知道线程调度是随机的,这不太好,有时我们想让不同的线程按顺序完成任务。这就要用到wait和notify方法,这两个方法是Object类的(所有类都有)
wait操作大概可以分为三步:
1)解锁(wait之后锁就没了)
2)阻塞等待通知
3)当接到通知以后,接触阻塞状态,并尝试获取锁
notify操作是随机唤醒一个线程(概率不均等),notifyAll唤醒所有线程。wait方法实现时1、2操作其实是一起的,防止线程调度使他接不到通知。还有一种情况就是,t4线程先执行,再执行t1、t2、t3的操作这会使它们接不到通知,陷入死等
三、sleep和wait的区别
1)wait是解锁再进入阻塞状态,而sleep是抱着锁死等
2)wait是能由notify主动唤醒的,sleep必须等超时时间唤醒(interrupt是结束线程)
更多推荐

所有评论(0)