最近看Think in Java中线程那一部分,说在run()的主循环中适当地插入yield()可有效地加快程序的运行,我对其中的解释不太理解,yield()方法的用途Java Doc上也只有寥寥数语,哪位高手可以帮我讲解讲解,不甚感激!另外,我想深入了解下volatile修饰符的原理及作用,烦请一并赐教。

解决方案 »

  1.   

    yield()的用途并不多,而且并不能保证一定凑效,更不能确信yield()会加快运行速度!yield()就是让某个线程不要太霸道,要把CPU让一些别的线程。<Thinking in JAVA>中说“be evened up”,很确切,就是说大伙扯平了。
      

  2.   

    yield( )只会在很少的情况下起作用,而且不能用来进行很严肃的调校。"原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何context switch(切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是因为它们都比较大,而JVM的设计规范又没有要求读操作和赋值操作必须是原子操作(JVM可以试着去这么作,但并不保证)。不过如果你在long或double前面加了volatile,那么它就肯定是原子操作了。
      

  3.   

    yield()就是让某个线程不要太霸道,要把CPU让一些别的线程。同意! 至于是否能加快速度,还不好说,不过确实它上有用处的.
      

  4.   

    volatile 的作用是保证原子操作吗?
       Thinking in Java 的 13.7 范例 CanStop 里面有代码
    //Must be volatile:
    private volatile boolean stop = false;
    这里boolean类型应该就已经是原子操作了,不需要再保证了。书里说 stop标志必须是volatile的,以便run()方法肯定看到他(否则的话,这个值可能本地缓存)我猜想 volatile表示这个值可能被别的线程改变,所以被标志为volatile的变量,每次都是从存储区中读取变量对应的值,而不是在该线程中本地缓存的值。因为本地缓存的值不能及时反映其他线程对这个变量的影响。
      

  5.   

    volatile是对变量的原子操作的说明修饰.
      

  6.   

    难道对boolean的操作不是原子操作吗?
    boolean应该是最小的基本类型啊。