Java Solaris Communities Sun Store Join SDN My Profile Why Join?
 
Bug Database
Bug Detail
Quick Lists
Top 25 Bugs
Top 25 RFE's
Recently Closed Bugs
Printable Page Printable Page


Bug Database
Bug ID: 6744953
Votes 18
Synopsis JFileChooser deadlock when shown after UI update and rescan
Category java:classes_swing
Reported Against
Release Fixed
State 11-Closed, duplicate of 6713352, bug
Priority: 3-Medium
Related Bugs
Submit Date 04-SEP-2008
Description
FULL PRODUCT VERSION :
java version "1.6.0_10-rc"
Java(TM) SE Runtime Environment (build 1.6.0_10-rc-b28)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)

ADDITIONAL OS VERSION INFORMATION :
 customer  Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
If a JFileChooser is shown after a UI update just after rescanCurrentDirectory() is called, the EDT will sometimes lock up.

This report is identical to 6741372 except that in the sample code, everything is wrapped in a SwingUtilities.invokeLater(). Note that the The invokerLater() around dg.setVisible() (mentioned as strange in the evaluation for 6741372) is necessary to cause the lock-up for this particular example.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run code.
Hit "Show Dialog" button.
Close dialog.
Hit "Show Dialog" button again.

If that doesn't work:
Run code.
Hit "Show Dialog" button.
Resize dialog so it fills the screen.
Navigate to a directory with a lot of files in it.
Close dialog.
Hit "Show Dialog" button again.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expect the dialog to be shown each time the "Show DIalog" button is hit.
ACTUAL -
The application will sometimes lock up.

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Thread dump during lock-up:

2008-08-29 07:01:36
Full thread dump Java HotSpot(TM) Client VM (11.0-b15 mixed mode, sharing):

"Basic L&F File Loading Thread" prio=6 tid=0x02b2b800 nid=0x8c waiting on condition [0x03d1f000..0x03d1fd14]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x229f6230> (a java.util.concurrent.FutureTask$Sync)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:905)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1217)
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
	at java.util.concurrent.FutureTask.get(FutureTask.java:83)
	at sun.awt.shell.Win32ShellFolderManager2$ComInvoker.invoke(Win32ShellFolderManager2.java:495)
	at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run0(BasicDirectoryModel.java:221)
	at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run(BasicDirectoryModel.java:216)

"TimerQueue" daemon prio=6 tid=0x030c8000 nid=0xe18 in Object.wait() [0x03cbf000..0x03cbfb94]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22a60108> (a javax.swing.TimerQueue)
	at javax.swing.TimerQueue.run(TimerQueue.java:236)
	- locked <0x22a60108> (a javax.swing.TimerQueue)
	at java.lang.Thread.run(Thread.java:619)

"Swing-Shell" daemon prio=6 tid=0x03058800 nid=0xbac waiting for monitor entry [0x0351f000..0x0351fd14]
   java.lang.Thread.State: BLOCKED (on  customer  monitor)
	at sun.awt.shell.Win32ShellFolder2.isFileSystem(Win32ShellFolder2.java:512)
	- waiting to lock <0x229b7190> (a sun.awt.shell.Win32ShellFolder2)
	at sun.awt.shell.Win32ShellFolder2.equals(Win32ShellFolder2.java:484)
	at java.util.AbstractList.equals(AbstractList.java:507)
	at java.util.Vector.equals(Vector.java:925)
	- locked <0x22a66ab8> (a java.util.Vector)
	at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:314)
	at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:221)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:458)
	at java.lang.Thread.run(Thread.java:619)

"D3D Screen Updater" daemon prio=8 tid=0x0304e000 nid=0x6dc in Object.wait() [0x0328f000..0x0328fd94]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22f5dab8> (a java.lang.Object)
	at sun.java2d.d3d.D3DScreenUpdateManager.run(D3DScreenUpdateManager.java:422)
	- locked <0x22f5dab8> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:619)

"DestroyJavaVM" prio=6 tid=0x002a6800 nid=0x230 waiting on condition [0x00000000..0x0090fd4c]
   java.lang.Thread.State: RUNNABLE

"AWT-EventQueue-0" prio=6 tid=0x02af7c00 nid=0x878 waiting on condition [0x02fce000..0x02fcfa14]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x229f4608> (a java.util.concurrent.FutureTask$Sync)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:905)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1217)
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:218)
	at java.util.concurrent.FutureTask.get(FutureTask.java:83)
	at sun.awt.shell.Win32ShellFolderManager2$ComInvoker.invoke(Win32ShellFolderManager2.java:495)
	at sun.awt.shell.Win32ShellFolder2.hasAttribute(Win32ShellFolder2.java:522)
	at sun.awt.shell.Win32ShellFolder2.isLink(Win32ShellFolder2.java:739)
	- locked <0x229b7190> (a sun.awt.shell.Win32ShellFolder2)
	at javax.swing.filechooser.FileSystemView.isFileSystem(FileSystemView.java:281)
	at javax.swing.filechooser.FileSystemView.getSystemDisplayName(FileSystemView.java:155)
	at javax.swing.plaf.basic.BasicFileChooserUI$BasicFileView.getName(BasicFileChooserUI.java:1157)
	at javax.swing.JFileChooser.getName(JFileChooser.java:1478)
	at sun.swing.FilePane$FileRenderer.getListCellRendererComponent(FilePane.java:1325)
	at javax.swing.plaf.basic.BasicListUI.updateLayoutState(BasicListUI.java:1349)
	at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(BasicListUI.java:1299)
	at javax.swing.plaf.basic.BasicListUI.getPreferredSize(BasicListUI.java:566)
	at javax.swing.JComponent.getPreferredSize(JComponent.java:1632)
	at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)
	at java.awt.Container.layout(Container.java:1398)
	at java.awt.Container.doLayout(Container.java:1387)
	at java.awt.Container.validateTree(Container.java:1485)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validateTree(Container.java:1491)
	at java.awt.Container.validate(Container.java:1457)
	- locked <0x22eae220> (a java.awt.Component$AWTTreeLock)
	at java.awt.Dialog.conditionalShow(Dialog.java:893)
	- locked <0x22eae220> (a java.awt.Component$AWTTreeLock)
	at java.awt.Dialog.show(Dialog.java:1019)
	at java.awt.Component.show(Component.java:1447)
	at java.awt.Component.setVisible(Component.java:1400)
	at java.awt.Window.setVisible(Window.java:824)
	at java.awt.Dialog.setVisible(Dialog.java:986)
	at JFileChooserBug11$1$1$1.setVisible(JFileChooserBug11.java:33)
	at JFileChooserBug11$1$1$2.run(JFileChooserBug11.java:46)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

"AWT-Windows" daemon prio=6 tid=0x02abcc00 nid=0xfc4 runnable [0x02f3f000..0x02f3fa94]
   java.lang.Thread.State: RUNNABLE
	at sun.awt.windows.WToolkit.eventLoop(Native Method)
	at sun.awt.windows.WToolkit.run(WToolkit.java:291)
	at java.lang.Thread.run(Thread.java:619)

"AWT-Shutdown" prio=6 tid=0x02abb400 nid=0xa0c in Object.wait() [0x02eef000..0x02eefb14]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22ea8e00> (a java.lang.Object)
	at java.lang.Object.wait(Object.java:485)
	at sun.awt.AWTAutoShutdown.run(AWTAutoShutdown.java:259)
	- locked <0x22ea8e00> (a java.lang.Object)
	at java.lang.Thread.run(Thread.java:619)

"Java2D Disposer" daemon prio=10 tid=0x02aba000 nid=0x468 in Object.wait() [0x02e9f000..0x02e9fb94]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22ea8e90> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
	- locked <0x22ea8e90> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
	at sun.java2d.Disposer.run(Disposer.java:125)
	at java.lang.Thread.run(Thread.java:619)

"Low Memory Detector" daemon prio=6 tid=0x02a71400 nid=0xd24 runnable [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x02a6b400 nid=0xd10 waiting on condition [0x00000000..0x02d1f940]
   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x02a69c00 nid=0x5cc waiting on condition [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x02a68800 nid=0xae8 runnable [0x00000000..0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x02a60400 nid=0xbb4 in Object.wait() [0x02c2f000..0x02c2fa94]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22ea90c0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
	- locked <0x22ea90c0> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x02a5f000 nid=0xe0c in Object.wait() [0x02bdf000..0x02bdfb14]
   java.lang.Thread.State: WAITING (on  customer  monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x22ea8b78> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:485)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
	- locked <0x22ea8b78> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x02a5d400 nid=0xce0 runnable

"VM Periodic Task Thread" prio=10 tid=0x02a7b800 nid=0x1b4 waiting on condition

JNI global references: 1146



REPRODUCIBILITY :
This bug can be reproduced often.

---------- BEGIN SOURCE ----------

import java.awt.event.*;
import javax.swing.*;

 public class JFileChooserBug11 {

   static JFileChooser fc;

   static JDialog dg;


   public static void main(String args[]) {
      SwingUtilities.invokeLater(
         new Runnable() {
            public void run() {
               try {
                  UIManager.setLookAndFeel(
                     "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
               }
               catch (Exception e) {
               }
            
               JDialog dialog = new JDialog();
               JButton button = new JButton("Show Dialog");
               button.addActionListener(
                  new ActionListener() {
                     public void actionPerformed(ActionEvent e) {
                        if (dg == null) {
                           dg =
                              new JDialog() {
                                  public void setVisible(boolean visible) {
                                    fc.rescanCurrentDirectory();
                                    super.setVisible(visible);
                                 }
                              };
                           fc = new JFileChooser();
                           dg.add(fc);
                           dg.pack();
                        }
                        else {
                           SwingUtilities.updateComponentTreeUI(dg);
                        }
                        SwingUtilities.invokeLater(
                               new Runnable() {
                                  public void run() {
                                    dg.setVisible(true);
                                 } });
                     }
                  });
               dialog.add(button);
               dialog.pack();
               dialog.setVisible(true);
            }
         });
   }
}


---------- END SOURCE ----------
Posted Date : 2008-09-04 21:28:21.0

FYI, NetBeans users faced system locks with very similar thread dump. Maybe it's not exactly the same case, as "Swing-Shell" thread claims to be runnable, so it doesn't look like real deadlock, but according to users system really locks up. Please see thread dumps and more information at http://www.netbeans.org/issues/show_bug.cgi?id=132961 thank you.
Posted Date : 2008-09-24 15:32:56.0
Work Around
N/A
Evaluation
I reproduced this bug with the latest JDK 6u10 build
accepted, assigned to the JFileChooser owner
Posted Date : 2008-09-05 10:41:46.0
Comments
  
  Include a link with my name & email   

Submitted On 03-OCT-2008
aston_chan
If you put invokeLater() around the call to rescanCurrentDirectory(), then the deadlock will go away.  I.e. replace 

fc.rescanCurrentDirectory();

with 

									SwingUtilities.invokeLater( new Runnable() {
    public void run() {
        fc.rescanCurrentDirectory();
    }
});

-Aston


Submitted On 14-OCT-2008
lbarowski
Even without a rescanCurrentDirectory(), this bug can occur in the normal course of business. Here are the relevant parts of a stack trace of another deadlock under 1.6.0_07:

"Basic L&F File Loading Thread" prio=6 tid=0x03987c00 nid=0xb68
waiting on condition [0x0505f000..0x0505fc14]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x22978368> (a java.util.concurrent.FutureTask$Sync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
    ...
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    ...
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run(BasicDirectoryModel.java:216)


"Swing-Shell" daemon prio=6 tid=0x02c34800 nid=0xaac runnable
[0x046df000..0x046dfd94]
   java.lang.Thread.State: RUNNABLE
    at sun.awt.shell.Win32ShellFolder2.getAttributes0(Native Method)
    ...
    at sun.awt.shell.Win32ShellFolder2.isDirectory(Win32ShellFolder2.java:589)
    at py.b(py.java)
    at v4.accept(v4.java:15)
    at javax.swing.JFileChooser.accept(JFileChooser.java:1576)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:235)
    ...
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:458)
    at java.lang.Thread.run(Thread.java:619)

"AWT-EventQueue-0" prio=6 tid=0x02c62000 nid=0xe4 waiting on condition
[0x03cff000..0x03cffa14]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x2298be38> (a java.util.concurrent.FutureTask$Sync)
    ...
    at sun.awt.shell.Win32ShellFolder2.hasAttribute(Win32ShellFolder2.java:520)
    at sun.awt.shell.Win32ShellFolder2.isHidden(Win32ShellFolder2.java:746)
    at nt.a(nt.java:134)
    at r4.getListCellRendererComponent(r4.java:10)
    ...
    at java.awt.Container.validate(Container.java:1491)
    ...
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)



Submitted On 14-OCT-2008
lbarowski
Oops, original bug has nothing to do with Nimbus L&F. L&F change was left in after modifying another bug report example.


Submitted On 14-OCT-2008
lbarowski
The Swing-Shell thread in the above trace is runnable, so maybe this is more like the NetBeans problem.


Submitted On 17-FEB-2009
Naresh_Devasani
Same problem occurs with JDK 6u11 also. And it is happening on only one (XP)machine.


Submitted On 12-MAR-2009
really a duplicate of 6741890


Submitted On 19-MAR-2009
Hi, 

Is there any workaround for this ? 

Thank you and regards,
Igor



Submitted On 26-MAR-2009
I want my day back


Submitted On 20-APR-2009
kisslas
Possible workaround added to 6741890. Any feedback there would be appreciated.



PLEASE NOTE: JDK6 is formerly known as Project Mustang