Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProGuard优化还删除了#wait()调用_Java_Multithreading_Optimization_Proguard - Fatal编程技术网

Java ProGuard优化还删除了#wait()调用

Java ProGuard优化还删除了#wait()调用,java,multithreading,optimization,proguard,Java,Multithreading,Optimization,Proguard,当Proguard优化我的应用程序时,所有对Object#wait()的调用都将被删除 因此,应该被动等待(直到通知)的每个线程现在都在主动等待(100%的CPU使用率) 当使用-dontoptimize关闭优化时,一切正常 如果我需要优化以删除具有-assumenosideeffects的某些方法,我正在搜索错误。 是否可以保留对对象的所有调用#wait()进行优化(删除) 还有其他解决办法吗 编辑1: 例如,此代码: @Override public void run() { is

当Proguard优化我的应用程序时,所有对
Object#wait()
的调用都将被删除

因此,应该被动等待(直到通知)的每个线程现在都在主动等待(100%的CPU使用率)

当使用
-dontoptimize
关闭优化时,一切正常

如果我需要优化以删除具有
-assumenosideeffects
的某些方法,我正在搜索错误。
是否可以保留对
对象的所有调用#wait()
进行优化(删除)

还有其他解决办法吗

编辑1: 例如,此代码:


@Override
public void run() {
    isRunning = true;
    try {
        while (isRunning) {
            if (parent.isActivate) {
                parent.updateDriveButtons();
                synchronized (this) {
                    wait(1000);
                }
            }
            else {
                synchronized (this) {
                    // Wait for that the page is activated.
                    Utils.wait(this);
                }
            }
        }
    }
    catch (Throwable e) {
        e.printStackTrace();
    }
    finally {
        isRunning = false;
    }
}
正在被此代码替换(在反编译优化代码后):
wait()
已被删除,只有通过
monitorenter可以看到同步<代码>监控退出


 public final void run()
  {
    this.isRunning = true;
    try {
      while (this.isRunning) {
        if (this.parent.isShowing()) {
          ...
          monitorenter;
          monitorexit; continue;
        }

        monitorenter;

        monitorexit;
      }return;
    } catch (Throwable localThrowable) {
      Object Ljava/lang/Object;;
      return;
    } finally {
      this.isRunning = false; } throw localObject1;
  }

您似乎正在指定与
对象#wait()
匹配的
-assumenosideeffects
选项。ProGuard会很高兴地为您删除这些呼叫。您可能不应该在ProGuard手册中记录的选项之外添加
-assumenosideeffects
选项。

您是否有一个简短但完整的程序来演示此问题?您真的验证过对
wait()
的调用是否真的被删除了吗?是否有可能您实际上只是有一些有缺陷的代码,而优化只是使该缺陷更加明显?我添加了一个示例,演示了由于同步块,此issuemonitorenter将已经存在。。。因此,
wait
调用不会被它所取代。如果它被删除了,那么是的,这听起来像一个bug。同样,一个简短但完整的示例(理想情况下是一个可以编译的完整类,然后是您用于Proguard的命令行)将使那些试图重现该问题的人的生活更加轻松。感谢您的评论,这使我有精力尝试隔离该问题。制作一个试图重现这个问题的小应用程序是不可能的,但它有助于找到解决方案。是的,你是对的,我的意思是这是一个非常危险的问题。我试图删除我的每一个'-assumenosideeffects',直到找到凶手。它是'-assumenosideeffects类com.st.utils.ShapeCheck{*;}'。这意味着Proguard不仅要删除ShapeCheck中定义的方法,还要删除“java.lang.Object”中定义的所有方法!