processing / processing/processing4
nf/nfc do not seem to be threadsafe and throw NullPointerException
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Java
- Star
- 494
- Fork
- 183
- Merge trung bình
- 4 giờ 39 phút
- Pull request đã merge (30 ngày)
- 3
Mô tả
Most appropriate sub-area of Processing 4?
Core/Environment/Rendering
Processing version
3 to current
Operating system
Linux
Steps to reproduce this
"1. Create a method calling nf(float, int, int), nf(int, int), nfc(float, int)
-
Run this method within a thread
thread("myFunction"). -
Let it run for a longer time"
This is a little bit harder to reproduce and I only got it first with a complex project.
After a while you will end up with either a Stackoverflow or NullPointerException like this.
java.lang.NullPointerException: Cannot assign field "fastPathContainer" because "this.fastPathData" is null
at java.base/java.text.DecimalFormat.resetFastPathData(DecimalFormat.java:1157)
at java.base/java.text.DecimalFormat.checkAndSetFastPathStatus(DecimalFormat.java:1081)
at java.base/java.text.DecimalFormat.fastFormat(DecimalFormat.java:1659)
at java.base/java.text.NumberFormat.format(NumberFormat.java:327)
at processing.core.PApplet.nf(PApplet.java:10108)
at core3.app.gui.GUIInfo.pre(GUIInfo.java:413)
at jdk.internal.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1436)
at processing.core.PApplet$RegisteredMethods.handle(PApplet.java:1429)
at processing.core.PApplet.handleMethods(PApplet.java:1628)
at processing.core.PApplet.handleDraw(PApplet.java:2473)
at processing.opengl.PSurfaceJOGL$DrawListener.display(PSurfaceJOGL.java:866)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1147)
at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:759)
at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:452)
at com.jogamp.opengl.util.FPSAnimator$MainTask.run(FPSAnimator.java:178)
at java.base/java.util.TimerThread.mainLoop(Timer.java:566)
at java.base/java.util.TimerThread.run(Timer.java:516)
snippet
Additional context
Doing a little bit research, the NumberFormat in nf/nfc seems not to be thread safe. General consent on this seems to be to use a ThreadLocal. So modifying PApplet like this, seems to fix it.
private static final ThreadLocal<NumberFormat> threadLocalIntNf = ThreadLocal.withInitial(() -> {
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false); // no commas
nf.setMinimumFractionDigits(0);
nf.setMaximumFractionDigits(0);
return nf;
});
static public String nf(float num, int left, int right) {
// if ((float_nf != null) &&
// (float_nf_left == left) &&
// (float_nf_right == right) &&
// !float_nf_commas) {
// return float_nf.format(num);
// }
float_nf = threadLocalIntNf.get();
float_nf.setGroupingUsed(false);
float_nf_commas = false;
float_nf.setMinimumIntegerDigits(left);
float_nf.setMinimumFractionDigits(right);
float_nf.setMaximumFractionDigits(right);
return float_nf.format(num);
}
Would you like to work on the issue?
I can provide my fix, but it needs some optimisation/cleanup.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu trong processing.core.PApplet, tại lệnh gọi nf được hiển thị trong stack trace, sau đó kiểm tra các đường dẫn định dạng nf và nfc liên quan cùng trạng thái NumberFormat của chúng. Chạy lặp lại tái hiện bằng luồng với nf(float, int, int), nf(int, int) và nfc(float, int); được xem là hoàn tất khi việc thực thi đồng thời không còn tạo ra NullPointerException hoặc StackOverflow đã báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java
- Lĩnh vực
- api
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100