开发者社区 问答 正文

java如何实现“自旋”

我本以为Thread.yield()是实现自旋的,不过yield()会放弃cpu时间片,那应该也会进行上下文切换吧?那就不是自旋了吧?(我理解的自旋是:当线程需要某个资源,但这个资源没有到位,这时就进行一个死循环,从而不放弃cpu执行时间,也不进行上下文切换)
我该怎么实现自旋呢?

展开
收起
蛮大人123 2016-03-03 14:01:52 2816 分享 版权
2 条回答
写回答
取消 提交回答
  • 最好别自己实现spinlock, 去用现成的吧. 这个想实现得好也没那么简单. 不是死循环就完了, 还需要用pause指令在里边放出cpu资源

    2019-07-17 18:51:21
    赞同 展开评论
  • 我说我不帅他们就打我,还说我虚伪

    一个简单的while就可以满足你的要求。
    目前的JVM实现自旋会消耗CPU,如果长时间不调用doNotify方法,doWait方法会一直自旋,CPU会消耗太大。

    public class MyWaitNotify3{
      MonitorObject myMonitorObject = new MonitorObject();
      boolean wasSignalled = false;
    
      public void doWait(){
        synchronized(myMonitorObject){
          while(!wasSignalled){
            try{
              myMonitorObject.wait();
             } catch(InterruptedException e){...}
          }
          //clear signal and continue running.
          wasSignalled = false;
        }
      }
      public void doNotify(){
        synchronized(myMonitorObject){
          wasSignalled = true;
          myMonitorObject.notify();
        }
      }
    }
    2019-07-17 18:51:21
    赞同 展开评论
问答分类:
问答地址: