<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-37306137.post6286527861871001503..comments</id><updated>2009-04-19T22:39:45.408+02:00</updated><category term='solution'/><category term='documentation'/><category term='XP'/><category term='mock objects'/><category term='bug'/><category term='postcard'/><category term='commercial'/><category term='gc'/><category term='AJAX'/><category term='mock'/><category term='customer'/><category term='done'/><category term='maven'/><category term='selenium'/><category term='po polsku'/><category term='leadership'/><category term='presentation'/><category term='buzz'/><category term='agile'/><category term='code coverage'/><category term='continuum'/><category term='video'/><category term='maintenance'/><category term='windows'/><category term='synchronizers'/><category term='tdd'/><category term='performance'/><category term='success story'/><category term='Spring'/><category term='CSM'/><category term='review'/><category term='training'/><category term='TIBCO'/><category term='debug'/><category term='lean'/><category term='knowledge'/><category term='JFreeChart'/><category term='refactoring'/><category term='tool'/><category term='waste'/><category term='tutorial'/><category term='XBean'/><category term='Mylyn'/><category term='principles'/><category term='communication'/><category term='Java'/><category term='jvm'/><category term='concurrency'/><category term='interview'/><category term='struts'/><category term='artifactory'/><category term='Eclipse'/><category term='optimization'/><category term='book review'/><category term='Scrum'/><category term='unit testing'/><category term='certificate'/><category term='final'/><category term='quality'/><category term='team'/><category term='collections'/><category term='requirements'/><category term='testing'/><category term='Wiki'/><category term='velocity'/><category term='deadlock'/><category term='management'/><category term='Xerces'/><title type='text'>Comments on From Java to Java EE: The power of the final keyword - updated</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.bielu.com/feeds/6286527861871001503/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html'/><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-37306137.post-7000045546958512851</id><published>2009-04-19T22:39:00.000+02:00</published><updated>2009-04-19T22:39:00.000+02:00</updated><title type='text'>There is a difference between creating new thread ...</title><content type='html'>There is a difference between creating new thread and letting thread pool to handle the runnable. In first case, you are invoking explicit memory synchronization barrier, in second it is not really guaranteed (might be implementation dependent I think).&lt;br /&gt;&lt;br /&gt;In Sun JDK implementation, I think it will work even with executor pool. Worker class is doing the runLock.lock(); before execution of actual Runnable starts (so it is loading state from common memory). Caller thread on the other hand is synchronizing in submit, which is calling execute, which is calling addIfUnderCorePoolSize, which will flush there with unlock before using the thread to run the runnable OR offering it to blocking queue from which Worker thread will retrieve it, also creating synchronization point.&lt;br /&gt;&lt;br /&gt;I'm not sure if this is possible to create Executor service which would allow for different behaviour and still be compatible with all the specs - but it is also not clearly specified that memory is synchronized before passing data to  worker threads. In such case, it is always better to stay on the safe side. In fact, it is always better to stay on the safe side, even in example you gave here, because it reduces amount of magic dependencies in code and allows nasty surprises when code is later refactored by somebody else. Plus final fields make things easier to understand even in single threaded code ;)&lt;br /&gt;&lt;br /&gt;Easiest example of need for final is  non-synchronized static variable which is pointing to some singleton-like data. If you don't care about possible multiple initializations, you can do lazy initialization of it from calling thread if needed. In such case, some other thread running 'later' might see null and will initialize it again - but it is not an issue. What it the issue is that if you use non-final fields in it, it can see a reference to the 'singleton', but still half-initialized/null contents, even if you initialized it fully before assigning to static variable.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/7000045546958512851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/7000045546958512851'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240173540000#c7000045546958512851' title=''/><author><name>abies</name><uri>http://www.blogger.com/profile/01153887805003519136</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1184628796'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-2837880874577677479</id><published>2009-04-19T21:31:00.000+02:00</published><updated>2009-04-19T21:31:00.000+02:00</updated><title type='text'>&amp;quot;@Shantany &amp;amp; Ram - you&amp;#39;re partially r...</title><content type='html'>&amp;quot;@Shantany &amp;amp; Ram - you&amp;#39;re partially right :) I forgot to add very important detail that it&amp;#39;s safe only fore reads i.e. when we assume map.put(...) statement will never occur.&amp;quot;&lt;br /&gt;&lt;br /&gt;If you never intended to make your map modifiable, the example makes absolutely no sense. I agree with abby that there was not a problem to begin with that you are trying to solve with your immutable class.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/2837880874577677479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/2837880874577677479'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240169460000#c2837880874577677479' title=''/><author><name>Ram</name><uri>http://www.blogger.com/profile/11046038651474815049</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1833270143'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-876962790012628877</id><published>2009-04-18T23:15:00.000+02:00</published><updated>2009-04-18T23:15:00.000+02:00</updated><title type='text'>abies is entirely correct. The JLS specifies that ...</title><content type='html'>abies is entirely correct. The JLS specifies that on Thread.start() happens before any other action on that thread. Thus, with or without final in, the new Thread will see the correct data for SomeClass. Since SomeClass and the Thread are constructed on the Main thread before the call to start() happens, then I would be interested to know how you think a NullPointerException can happen on the newly spawned Thread.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/876962790012628877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/876962790012628877'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240089300000#c876962790012628877' title=''/><author><name>Mike K</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-53454466'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-7188449407308312116</id><published>2009-04-18T19:36:00.000+02:00</published><updated>2009-04-18T19:36:00.000+02:00</updated><title type='text'>You sound resonable and this is the reason why I h...</title><content type='html'>You sound resonable and this is the reason why I have to confront your opinion with this comment: http://java2jee.blogspot.com/2008/11/java-concurrency-is-easy-combining.html?showComment=1226948760000#c4144762493589566546&lt;br /&gt;&lt;br /&gt;Any ideas? Does it make a difference when you create new thread and when you submit your task to the executore service?</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/7188449407308312116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/7188449407308312116'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240076160000#c7188449407308312116' title=''/><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-819301471'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-3244107302673874379</id><published>2009-04-18T13:25:00.000+02:00</published><updated>2009-04-18T13:25:00.000+02:00</updated><title type='text'>Sorry to be nitpicking, but multithreading program...</title><content type='html'>Sorry to be nitpicking, but multithreading programming is about details:&lt;br /&gt;&lt;br /&gt;"Look - in the code I provided I create new thread together with creating the object of SimpleClass."&lt;br /&gt;&lt;br /&gt;No, you are creating new thread after SimpleClass has finished initialization. Even that doesn't matter so much, as it is the 'start' method which is really spawning a new execution thread, which is called even after Thread constructor.&lt;br /&gt;&lt;br /&gt;From &lt;br /&gt;http://gee.cs.oswego.edu/dl/cpj/jmm.html&lt;br /&gt;&lt;br /&gt;"Thread.start has the same memory effects as a lock release by the thread calling start, followed by a lock acquire by the started thread."&lt;br /&gt;&lt;br /&gt;On lock release, thread view of data is flushed to common memory. On lock acquire, thread view of data is synced from common memory. This means, that anything put in code of calling thread before .start is called will be fully visible to new thread. As SimpleClass is fully finishes initialization even without final keyword, it will be visible to spawned thread.&lt;br /&gt;&lt;br /&gt;Only tricky part with thread creation is if you spawn a new thread from constructor of the object and let 'this' pointer escape to the new thread. In such case, you are out of luck even if final keyword is used.&lt;br /&gt;&lt;br /&gt;I think that&lt;br /&gt;http://moonbase.rydia.net/mental/blog/programming/java/the-java-memory-model-for-programmers&lt;br /&gt;got it right in the small table in the middle of the post. You can see there&lt;br /&gt;Writes up to and including… &lt;br /&gt;    a call to Thread.start&lt;br /&gt;...are made visible to…&lt;br /&gt;    the newly started thread.&lt;br /&gt;&lt;br /&gt;You may want to browse the rest of the cases to get better understanding of the relations between threads.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/3244107302673874379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/3244107302673874379'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240053900000#c3244107302673874379' title=''/><author><name>abies</name><uri>http://www.blogger.com/profile/01153887805003519136</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1184628796'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-6788002255109447200</id><published>2009-04-18T12:19:00.000+02:00</published><updated>2009-04-18T12:19:00.000+02:00</updated><title type='text'>ERRATA: when we assume map.put(...) statement will...</title><content type='html'>ERRATA: when we assume map.put(...) statement will never occur AFTER the object is created. On the other hand preProcessMap() can do whathever reads and writes it likes because until the constructor is finished final fields are safe to modify.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6788002255109447200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6788002255109447200'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240049940000#c6788002255109447200' title=''/><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-819301471'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-6747102478710441736</id><published>2009-04-18T11:30:00.000+02:00</published><updated>2009-04-18T11:30:00.000+02:00</updated><title type='text'>@Shantany &amp;amp; Ram - you&amp;#39;re partially right :...</title><content type='html'>@Shantany &amp;amp; Ram - you&amp;#39;re partially right :) I forgot to add very important detail that it&amp;#39;s safe only fore reads i.e. when we assume map.put(...) statement will never occur.&lt;br /&gt;&lt;br /&gt;@abies - synchronization of start() method only guarantees that &amp;quot;It is never legal to start a thread more than once.&amp;quot; not that the initialization of the object in another thread will finishe before starting this thread. Look - in the code I provided I create new thread together with creating the object of SimpleClass. You cannot be sure what will be done first because the second thread is being created.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6747102478710441736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6747102478710441736'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240047000000#c6747102478710441736' title=''/><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-819301471'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-2271934765467324210</id><published>2009-04-18T08:38:00.000+02:00</published><updated>2009-04-18T08:38:00.000+02:00</updated><title type='text'>Thread.start is synchronized. Before that new thre...</title><content type='html'>Thread.start is synchronized. Before that new thread is not existing, so it cannot have a copy of old memory from before that moment.&lt;br /&gt;&lt;br /&gt;I think that your particular example will work perfectly well without final keyword.&lt;br /&gt;&lt;br /&gt;Which clearly shows that concurrency is NOT easy ;)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/2271934765467324210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/2271934765467324210'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240036680000#c2271934765467324210' title=''/><author><name>abies</name><uri>http://www.blogger.com/profile/01153887805003519136</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1184628796'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-5986078445477368630</id><published>2009-04-18T07:47:00.000+02:00</published><updated>2009-04-18T07:47:00.000+02:00</updated><title type='text'>Agree with Shantanu, it is too simplistic to assum...</title><content type='html'>Agree with Shantanu, it is too simplistic to assume final is be all and end all for being thread safe. &lt;br /&gt;&lt;br /&gt;It will be safer to say synchronized is what makes things thread safe. &lt;br /&gt;&lt;br /&gt;Of course that comes with a cost. We can reduce the cost by reducing the scope of synchronization through some strategies. &lt;br /&gt;&lt;br /&gt;Using the appropriate concurrent utils in jdk5+ is one way to achieve this. &lt;br /&gt;&lt;br /&gt;Using thread local variables is another. &lt;br /&gt;&lt;br /&gt;Limiting all modifications of shared object to a dedicated thread is yet another. &lt;br /&gt;&lt;br /&gt;Ensuring every thread has its own copy of data to work on is yet another - maybe this is truly what you wanted to get at here. &lt;br /&gt;&lt;br /&gt;Remember that a completely immutable object is not very useful for most processing purposes.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/5986078445477368630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/5986078445477368630'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240033620000#c5986078445477368630' title=''/><author><name>Ram</name><uri>http://www.blogger.com/profile/11046038651474815049</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1833270143'/></entry><entry><id>tag:blogger.com,1999:blog-37306137.post-6232682868065365877</id><published>2009-04-18T05:50:00.000+02:00</published><updated>2009-04-18T05:50:00.000+02:00</updated><title type='text'>This one is a really bad example. What if you acci...</title><content type='html'>This one is a really bad example. What if you accidentally write a map.put(...) statement in the code somewhere? Or what if a maintenance programmer does that?&lt;br /&gt;&lt;br /&gt;final is fine for primitives. But for objects you need immutable data types (e.g. Collections.unmodifiableMap(...)).</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6232682868065365877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37306137/6286527861871001503/comments/default/6232682868065365877'/><link rel='alternate' type='text/html' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html?showComment=1240026600000#c6232682868065365877' title=''/><author><name>Shantanu Kumar</name><uri>http://www.blogger.com/profile/05850495396182844220</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html' ref='tag:blogger.com,1999:blog-37306137.post-6286527861871001503' source='http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-2021330561'/></entry></feed>
