<Swing Dev> How to resolve image tearing
Alexander Potochkin
Alexander.Potochkin at oracle.com
Tue May 31 13:39:09 UTC 2011
Hello Ximalaya
> Thank you all, good conclusion to JDK users, :)
A small follow-up from me:
JComponent.repaint() indeed called getLocationOnScreen() for a short
period of time in JDK 7
but it was fixed in b132, the bug's number is 6993171
JDK 6 has never have it
Let me know if there are any problem with that
Thanks
alexp
> At 2011-05-28 01:40:28£¬"Anthony Petrov"<anthony.petrov at oracle.com> wrote:
>
> >On 5/27/2011 7:33 PM, tom.hawtin at oracle.com wrote:
> >> On 27/05/2011 15:37, Walter Laan wrote:
> >>>> We didn't change JComponent.repaint() to make it "no longer thread
> >>> safe"
> >>>> and I don't see why someone may think about it
> >>>
> >>> The bug report https://netbeans.org/bugzilla/show_bug.cgi?id=192548
> >>> shows the stack:
> >>> -
> >>> With the latest changes to jdk7 and jdk6 update 22 it's no longer true
> >>> due to
> >>> repaint()'s call to getLocationOnScreen() which acquires AWT tree lock:
> >>
> >> Whilst not ideal, it doesn't seem unreasonable that repaint should
> >> acquire a lock (that's usually how thread-safety is done).
> >>
> >> The stack trace in that bug doesn't appear to show a deadlock as such.
> >> What it does show is Netbean waiting on one of its own locks on the AWT
> >> EDT.
> >>
> >> "AWT-EventQueue-0" prio=6 tid=0x04713c00 nid=0x7d8 in Object.wait()
> >> [0x0599e000]
> >>
> >> java.lang.Thread.State: WAITING (on object monitor)
> >> at java.lang.Object.wait(Native Method)
> >> - waiting on<0x1c24efb0> (a
> >> org.netbeans.lib.editor.util.PriorityMutex)
> >
> >Thanks Tom. That's a nice find.
> >
> >I'm not sure if this is documented somewhere (if not, it should be), but
> >while being multi-threaded, AWT doesn't tolerate blocking of the EDT
> >under any circumstances. It's a general understanding/agreement that
> >events must be processed as fast as possible. Moreover, this is
> >especially relevant to Swing since most of Swing operations should take
> >place on the EDT *only*, and as such keeping the thread unblocked is
> >vital for Swing to operate correctly. The library even provides the
> >SwingWorker utility class that helps process long operations while
> >allowing the EDT to handle other events.
> >
> >The only allowed case when the EDT can be blocked is displaying a modal
> >(J)Dialog by means of calling its setVisible(true) from an event
> >handler. In this case AWT/Swing are responsible for keeping the wheel
> >rolling. In all other cases a blocked EDT may cause problems that
> >AWT/Swing simply can't resolve.
> >
> >So, if the deadlock (or whatever it is) is caused by blocking the EDT,
> >this suggests that it is NetBeans that's causing the problem, not JDK.
> >
> >--
> >best regards,
> >Anthony
>
>
More information about the swing-dev
mailing list