Be carefull with Calendar.getInstance() and TimeZone.getTimeZone()

Recently I was involved in running some performance test and one of my colleagues found, that some threads are blocked. He found out two interesting things in thread dump.

   java.lang.Thread.State: BLOCKED on java.lang.Class@2fa3ff86 owned by: some_thread
	at java.util.TimeZone.getDefaultInAppContext(TimeZone.java:723)
	at java.util.TimeZone.getDefaultRef(TimeZone.java:619)
	at java.util.Calendar.getInstance(Calendar.java:968)

As I checked this is something new in Java 7. In Java 6 calling Calendar.getInstance() was safe. Now it appears that private methond getDefaultInAppContext is called, which is synchronized. The biggest problem is that it is also static. That basically means that each call to Calendar.getInstance() will be synchronized.

java.lang.Thread.State: BLOCKED on java.lang.Class@2fa3ff86 owned by: some_thread
at java.util.TimeZone.getTimeZone(TimeZone.java:556)

getTimeZone method is also synchronized.

What is really strange for me, is that documentation (Timezone) says nothing about synchronization in both cases. If you perform many operations on dates in multiple threads you can have some serious performance problems.