Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8187267

Deadlock with AbstractDocument

XMLWordPrintable

    • x86_64
    • linux_ubuntu

      FULL PRODUCT VERSION :
      openjdk version "1.8.0_131"
      OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.17.04.3-b11)
      OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Linux ____________ 4.10.0-32-generic #36-Ubuntu SMP Tue Aug 8 12:10:06 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      CPU: Ryzen 7 1700X (an 8/16 core/thread cpu, may affect things because of high thread count)

      A DESCRIPTION OF THE PROBLEM :
      Get the Code producing the Bug from Git: https://github.com/Vazkii/CMPDL

      The Code produced a deadlock after taking the steps below. It involves a Thread (Operator in this case, sometimes main too) and the AWT-EventThread-$. The Thread sets the Text of an JTextField (replacing it, inportant), so it locks an AbstractDocument-Object for write and later enters a synchronized call. The AWT-EventThread is in an synchronized call on the same object and tries to get a read OR write lock on the AbstractDocument, causing the Deadlock. See ThreadDump below, the synchronized and lock stacks are marked.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      - Open the Application
      - put this url (as an example) in the Modpack UTL field: https://minecraft.curseforge.com/projects/age-of-engineering
      - hit download

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      A Log with download progress
      ACTUAL -
      3 lines of log (mostly, deadlocks are random)

      resulting Deadlock

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      "Operator@2341" daemon prio=6 tid=0x1e nid=NA waiting for monitor entry
        java.lang.Thread.State: BLOCKED
      waiting for AWT-EventQueue-1@1741 to release lock on <0xb57> (a java.awt.Component$AWTTreeLock) <- synchronized
      at java.awt.Component$AccessibleAWTComponent.getLocationOnScreen(Component.java:9488)
      at javax.swing.JComponent$AccessibleJComponent.getLocationOnScreen(JComponent.java:3663)
      at javax.swing.text.JTextComponent$AccessibleJTextComponent.caretUpdate(JTextComponent.java:2559)
      at javax.swing.text.JTextComponent.fireCaretUpdate(JTextComponent.java:397)
      at javax.swing.text.JTextComponent$MutableCaretEvent.fire(JTextComponent.java:4394)
      at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(JTextComponent.java:4416)
      at javax.swing.text.DefaultCaret.fireStateChanged(DefaultCaret.java:802)
      at javax.swing.text.DefaultCaret.changeCaretPosition(DefaultCaret.java:1274)
      at javax.swing.text.DefaultCaret.handleSetDot(DefaultCaret.java:1173)
      at javax.swing.text.DefaultCaret.setDot(DefaultCaret.java:1154)
      at javax.swing.text.DefaultCaret$Handler.insertUpdate(DefaultCaret.java:1723)
      at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:201)
      at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:748)
      at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:707)
      at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
      at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:669) <- lock
      at javax.swing.text.JTextComponent.setText(JTextComponent.java:1669)
      at vazkii.cmpdl.Interface.addLogLine(Interface.java:45)
      at vazkii.cmpdl.CMPDL.log(CMPDL.java:379)
      at vazkii.cmpdl.CMPDL.downloadFromURL(CMPDL.java:90)
      at vazkii.cmpdl.OperatorThread.run(OperatorThread.java:19)





      "AWT-EventQueue-1@1741" prio=6 tid=0x19 nid=NA waiting
        java.lang.Thread.State: WAITING
      blocks Operator@2341
      at java.lang.Object.wait(Object.java:-1)
      at java.lang.Object.wait(Object.java:502)
      at javax.swing.text.AbstractDocument.readLock(AbstractDocument.java:1387) <- lock
      at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:908)
      at javax.swing.plaf.basic.BasicTextAreaUI.getPreferredSize(BasicTextAreaUI.java:120)
      at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
      at javax.swing.JTextArea.getPreferredSize(JTextArea.java:618)
      at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:791)
      at java.awt.Container.layout(Container.java:1510)
      at java.awt.Container.doLayout(Container.java:1499)
      at java.awt.Container.validateTree(Container.java:1695)
      at java.awt.Container.validate(Container.java:1630)
      - locked <0xb57> (a java.awt.Component$AWTTreeLock) <- synchronized
      at javax.swing.RepaintManager$3.run(RepaintManager.java:711)
      at javax.swing.RepaintManager$3.run(RepaintManager.java:709)
      at java.security.AccessController.doPrivileged(AccessController.java:-1)
      at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
      at javax.swing.RepaintManager.validateInvalidComponents(RepaintManager.java:708)
      at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1731)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
      at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
      at java.awt.EventQueue.access$500(EventQueue.java:97)
      at java.awt.EventQueue$3.run(EventQueue.java:709)
      at java.awt.EventQueue$3.run(EventQueue.java:703)
      at java.security.AccessController.doPrivileged(AccessController.java:-1)
      at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
      at org.GNOME.Accessibility.AtkWrapper$5.dispatchEvent(AtkWrapper.java:700)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
      at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


      REPRODUCIBILITY :
      This bug can be reproduced often.

      ---------- BEGIN SOURCE ----------
      I have tried recreating the Bug but failed. The still really unstable NVidia drivers crashed on me when executing and I do not want to risk having to fill in this bug report a secound time...

      BUT this bug continues to have an effect on the Github code, this is an experimental code NOT showing the bug:




      import javax.swing.JFrame;
      import javax.swing.JTextField;
      import java.awt.HeadlessException;

      public class JTextFieldBug extends JFrame implements Runnable {

      JTextField text;

      public JTextFieldBug() throws HeadlessException {
      setSize(800, 640);
      setTitle("Test");

      text = new JTextField();
      text.setText("Initial");
      add(text);

      setVisible(true);
      }

      @Override
      public void run() {
      try {
      while (true) {
      text.setText("");
      for (int i = 0; i < 1000; i++) {
      text.setText(text.getText() + "a");
      setTitle(String.valueOf(i));
      }
      Thread.sleep(10);
      }
      } catch (InterruptedException ignore) {

      }
      }

      public static void main(String[] args) {
      new JTextFieldBug().run();
      }

      }
      ---------- END SOURCE ----------

            pardesha Pardeep Sharma
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: