解释在 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 数据来创建您的视频,那么您可能有一个并行流来生成数据,分别处理每个部分,然后将它们再次组合成一张图片。使用无需手动创建线程和线程安全即可完成的流。
在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 数据来创建您的视频,那么您可能有一个并行流来生成数据,分别处理每个部分,然后将它们再次组合成一张图片。使用无需手动创建线程和线程安全即可完成的流。