高手赐教: Java线程中yield()和修饰符volatile 最近看Think in Java中线程那一部分,说在run()的主循环中适当地插入yield()可有效地加快程序的运行,我对其中的解释不太理解,yield()方法的用途Java Doc上也只有寥寥数语,哪位高手可以帮我讲解讲解,不甚感激!另外,我想深入了解下volatile修饰符的原理及作用,烦请一并赐教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 yield()的用途并不多,而且并不能保证一定凑效,更不能确信yield()会加快运行速度!yield()就是让某个线程不要太霸道,要把CPU让一些别的线程。<Thinking in JAVA>中说“be evened up”,很确切,就是说大伙扯平了。 yield( )只会在很少的情况下起作用,而且不能用来进行很严肃的调校。"原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何context switch(切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是因为它们都比较大,而JVM的设计规范又没有要求读操作和赋值操作必须是原子操作(JVM可以试着去这么作,但并不保证)。不过如果你在long或double前面加了volatile,那么它就肯定是原子操作了。 yield()就是让某个线程不要太霸道,要把CPU让一些别的线程。同意! 至于是否能加快速度,还不好说,不过确实它上有用处的. volatile 的作用是保证原子操作吗? Thinking in Java 的 13.7 范例 CanStop 里面有代码//Must be volatile:private volatile boolean stop = false;这里boolean类型应该就已经是原子操作了,不需要再保证了。书里说 stop标志必须是volatile的,以便run()方法肯定看到他(否则的话,这个值可能本地缓存)我猜想 volatile表示这个值可能被别的线程改变,所以被标志为volatile的变量,每次都是从存储区中读取变量对应的值,而不是在该线程中本地缓存的值。因为本地缓存的值不能及时反映其他线程对这个变量的影响。 volatile是对变量的原子操作的说明修饰. 难道对boolean的操作不是原子操作吗?boolean应该是最小的基本类型啊。 懂XML的朋友进来看看,帮个忙!! dwr怎么配置环境 如何取得MP3文件的时间长度 ·#……*……%*%( 一个关于taglib el的问题,变量怎么表示? 请问如何替换字符串中指定字符?比如替换掉字符串中所有双引号,应该用什么方法? java中构造函数的执行过程 用JAVA语言查找文件的问题,谢谢!急!!!! 这些表怎么用SQL写出来!!!!!!!!!!!!!(oracle8.16) Java的三种境界,你在哪一种? 对象之间如何通过套接字进行通信? 一直本分揭帖,想不到信誉分被扣,想不明白,散完1000分不准备揭帖了(二)!
Thinking in Java 的 13.7 范例 CanStop 里面有代码
//Must be volatile:
private volatile boolean stop = false;
这里boolean类型应该就已经是原子操作了,不需要再保证了。书里说 stop标志必须是volatile的,以便run()方法肯定看到他(否则的话,这个值可能本地缓存)我猜想 volatile表示这个值可能被别的线程改变,所以被标志为volatile的变量,每次都是从存储区中读取变量对应的值,而不是在该线程中本地缓存的值。因为本地缓存的值不能及时反映其他线程对这个变量的影响。
boolean应该是最小的基本类型啊。