解释在 Processing sketch 中使用 Java 单词 synchronized

Explain the use of the Java word synchronized in a Processing sketch

Peter Lager (aka Quark) the word synchronized frequently appears, as in the code snippet below, copied from here优秀的G4P制作的节目中。基于这个例子,我打算在一个Processing sketch中使用两个windows,主window显示经纬度等数据,第二个显示天空中的卫星视图window。主程序将设置一个卫星数据数组,这些数据将被读取以在辅助 window 中显示。稍后我将扩展程序以记录旅程中的 GPS 数据,并制作天空图片和旅程的视频。 (我在 Sinclair QL 模拟上用 SuperBasic 做了一个类似的项目,但它有一些缺点,我可以用 Processing 克服)

我已阅读 Java 中的 this description of synchronized,但不明白为什么它适用于此处。无论是否使用该词,下面的草图和其他测试似乎都以相同的结果运行。

请有人解释一下 synchronized 这个词是否真的需要,或者随着程序的扩展可能变得有必要。包含它有什么缺点吗?

import g4p_controls.*;

GWindow myWindow;

    public void setup(){
      size(480, 320, JAVA2D);

      G4P.messagesEnabled(false);
      G4P.setGlobalColorScheme(GCScheme.BLUE_SCHEME);
      G4P.setCursor(ARROW);

      if(frame != null){
        frame.setTitle("Sketch Window");
      }

      myWindow = new GWindow(this, "Window title", 0, 0, 240, 120, false, JAVA2D);
      myWindow.addDrawHandler(this, "myWindowDraw");
    }

    public void draw(){
      background(100, 230, 100);
      fill(0);
      text("Main WIndow", 20 ,20);
    }

    // public void myWindowDraw(GWinApplet appc, GWinData data) {
    synchronized public void myWindowDraw(GWinApplet appc, GWinData data) {
      appc.background(100,100,200);
      appc.fill(0,0,160);
      appc.noStroke();

      appc.ellipse(appc.width/2, appc.height/2, appc.width/1.2, appc.height/1.2); 
      appc.fill(255);
      appc.text("Secondary window", 20, 20);   
    }

如果您的应用程序不是多线程的,则不需要使用 synchronized。然而,大多数现代处理器都是多核的,并且依靠应用程序中的多线程来实现最佳性能。如果您的应用程序不是并且不太可能是高性能,那么您可以忽略 synchronized.

如果在某个阶段增强代码以利用多线程,则需要将其更改为 'thread safe'。如今,许多程序员更喜欢从一开始就将线程安全构建到他们的代码中,以避免以后的这种努力。对于构建将以多种不同方式使用的库的程序员来说尤其如此。

在 Java8 中,您还有另一种选择来利用多线程。流库现在明确支持并行流来拆分工作负载并在以后组合 (reducing/collecting) 它们。如果这很可能满足您对速度的需求,那么您可以再次忽略同步并使用并行流来利用并行处理。例如,如果在某个阶段您需要处理大量 GPS 数据来创建您的视频,那么您可能有一个并行流来生成数据,分别处理每个部分,然后将它们再次组合成一张图片。使用无需手动创建线程和线程安全即可完成的流。