Bug 569562 - use double-check locking idiom for performance

Reduce synchronization scope for few methods to the minimum according to
the well known double-check idiom.

The duration of the test

org.eclipse.jdt.ui.tests.quickfix.CleanUpStressTest.testAllCleanUps()

drops a few seconds with this change.

Besides there are a few cases where methods are changed that did not use
the synchronize keyword. It should not be slower this way but safer. But
it is not clear if it really is needed.

Basically this change should have been applied already when the code was
migrated to depend as minimum on java 5. I did not change all code
affected but a few cases.

Here a quote from Joshua Bloch (see last link)

If you need high-performance lazy initializing of an instance field, use
the double-check idiom with a volatile field. This idiom wasn't
guaranteed to work until release 5.0, when the platform got a new memory
model. The idiom is very fast but also complicated and delicate, so
don't be tempted to modify it in any way. Just copy and paste --
normally not a good idea, but appropriate here:

// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;

private FieldType getField() {
   FieldType result = field;
   if (result != null)    // First check (no locking)
       return result;

   synchronized(this) {
       if (field == null) // Second check (with locking)
           field = computeFieldValue();
       return field;
   }
}

see https://docs.google.com/document/d/1mAeEgQu4H4ADxa03k7YaVDjIP5vJBvjVIjg3DIvoc8E/edit

don't use
https://www.oracle.com/technical-resources/articles/javase/bloch-effective-08-qa.html

Change-Id: I7eb783a7feef0d544fcbd4c30938668032be8b12
Signed-off-by: Carsten Hammer <carsten.hammer@t-online.de>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/173560
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
1 file changed
tree: a0a2630b29d7346e3e4f38d645375fcb12d489e2
  1. org.eclipse.jdt.astview/
  2. org.eclipse.jdt.astview.feature/
  3. org.eclipse.jdt.core.manipulation/
  4. org.eclipse.jdt.jeview/
  5. org.eclipse.jdt.jeview.feature/
  6. org.eclipse.jdt.junit/
  7. org.eclipse.jdt.junit.core/
  8. org.eclipse.jdt.junit.runtime/
  9. org.eclipse.jdt.junit4.runtime/
  10. org.eclipse.jdt.junit5.runtime/
  11. org.eclipse.jdt.text.tests/
  12. org.eclipse.jdt.ui/
  13. org.eclipse.jdt.ui.examples.javafamily/
  14. org.eclipse.jdt.ui.examples.projects/
  15. org.eclipse.jdt.ui.junit.sampleproject/
  16. org.eclipse.jdt.ui.tests/
  17. org.eclipse.jdt.ui.tests.refactoring/
  18. org.eclipse.jdt.ui.unittest.junit/
  19. org.eclipse.jdt.ui.unittest.junit.feature/
  20. org.eclipse.ltk.core.refactoring/
  21. org.eclipse.ltk.core.refactoring.tests/
  22. org.eclipse.ltk.ui.refactoring/
  23. org.eclipse.ltk.ui.refactoring.tests/
  24. tests-pom/
  25. .gitignore
  26. CONTRIBUTING
  27. LICENSE
  28. NOTICE
  29. pom.xml
  30. README.md
README.md

Contributing to JDT UI - Java development tools UI

Thanks for your interest in this project.

Project description:

The JDT UI implements the user interface for the Java IDE. This includes views like Package Explorer and JUnit, the Java and properties files editors, Java search, and refactorings. Website: http://www.eclipse.org/jdt/ui/

How to contribute:

Contributions to JDT UI are most welcome. There are many ways to contribute, from entering high quality bug reports, to contributing code or documentation changes. For a complete guide, see the [How to Contribute] 1 page on the team wiki.

Developer resources:

Information regarding source code management, builds, coding standards, and more.

Contributor License Agreement:

Before your contribution can be accepted by the project, you need to create and electronically sign the Eclipse Foundation Contributor License Agreement (CLA).

Forum:

Public forum for Eclipse JDT users.

Search for bugs:

This project uses Bugzilla to track ongoing development and issues.

Create a new bug:

Be sure to search for existing bugs before you create another one. Remember that contributions are always welcome!

Contact:

Contact the project developers via the project's “dev” list.

License

Eclipse Public License (EPL) v2.0