<?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/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5973770720692284621</id><updated>2012-01-25T02:51:31.371-08:00</updated><category term='C++'/><category term='test'/><category term='jucprofiler'/><category term='concurrent program'/><category term='java'/><category term='tool'/><category term='pattern'/><category term='parallel'/><category term='ANN'/><category term='performance'/><category term='parallel error'/><category term='profiling'/><category term='deadlock'/><category term='library'/><category term='juc'/><title type='text'>Software Technology for Multi-core</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-4053913829750774709</id><published>2010-02-10T02:05:00.001-08:00</published><updated>2010-02-10T02:07:30.227-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlock'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel error'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrent program'/><title type='text'>Say goodbye to awful concurrency bugs -- Showcase of MulticoreSDK on Derby</title><content type='html'>&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;In my last blog, I illustrate one of the notorious concurrency bugs – deadlocks, and how to find them without reproducing the deadlock using &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;MulticoreSDK&lt;/a&gt;. The sample I gave was the classic  &lt;a href="http://en.wikipedia.org/wiki/Dining_philosophers_problem"&gt;dining philosophers problem&lt;/a&gt;. To verify how effective the tool is, I am thinking that MulticoreSDK should be applied to real-world applications to find real deadlocks.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Finally I found one &lt;a href="https://issues.apache.org/jira/browse/DERBY-4129"&gt;real deadlock case&lt;/a&gt; reported in &lt;a href="http://db.apache.org/derby/"&gt;Derby&lt;/a&gt;, an open source relational database implemented in Java. Then this real deadlock case becomes one of our benchmarks to verify effectiveness of MulticoreSDK deadlock detector.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;I downloaded the driver program &lt;a href="https://issues.apache.org/jira/secure/attachment/12404320/BlobDeadlock.java"&gt;BlobDeadlock.java&lt;/a&gt; and the &lt;a href="http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.zip"&gt;buggy Derby version&lt;/a&gt;. Apply MulticoreSDK in the deadlock case with following steps,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Download  &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;MulticoreSDK&lt;/a&gt;  from its website, and install it following the user manual. Suppose  MulticoreSDK is extracted under &lt;span style="color: blue;"&gt;&lt;i&gt;&lt;span&gt;{msdk-cmd}&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Open  &lt;i&gt;&lt;span&gt;KingProperties&lt;/span&gt;&lt;/i&gt; file  in &lt;i&gt;&lt;span&gt;props&lt;/span&gt;&lt;/i&gt; folder, set  preference &lt;i&gt;&lt;span&gt;targetClasses =  org/apache/derby&lt;/span&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span&gt;  to instrument and monitor all classes in Derby.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Compile  the driver program,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;$ mkdir bin &amp;amp;&amp;amp; javac -d bin BlobDeadlock.java&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol start="4"&gt;&lt;li&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Run  the driver program with MulticoreSDK (no real deadlock occurs in  execution)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal;"&gt;&lt;span&gt;$ java &lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span&gt;-Dcontest.preferences={msdk-cmd}/prop/KingProperties -javaagent:{msdk-cmd}/lib/ConTest.jar&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span&gt; -cp .:bin:derby.jar BlobDeadlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol start="5"&gt;&lt;li&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Run  post analysis against trace file,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;$ java -ea -cp ConTest.jar com.ibm.contest.lock_dis_checker.Main .&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-style: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Surprisingly, the post analysis found no deadlock cycle. I first checked the trace file generated in step 4 and &lt;a href="https://issues.apache.org/jira/secure/attachment/12404319/threaddump.txt"&gt;threaddump.txt&lt;/a&gt; indicates where the deadlock happens. According to threaddump.txt file, one of the two threads involved in the deadlock is waiting to acquire lock at java.util.Observable.deleteObserver(Observable.java:78). I realize that in step 2, we didn't specify to instrument Java core classes, such as java.util.Observable, etc. So the locks taken in Observable class were not traced in  file. Perhaps it's the root cause why MulticoreSDK doesn't report the deadlock in Derby.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Following additional steps are taken to instrument class Observable,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol type="a"&gt;&lt;li&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Open  &lt;i&gt;&lt;span&gt;KingProperties&lt;/span&gt;&lt;/i&gt; file  in &lt;i&gt;&lt;span&gt;props&lt;/span&gt;&lt;/i&gt; folder, set  preference &lt;i&gt;&lt;span&gt;targetClasses =  java/util/Observable&lt;/span&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Instrument  class Observable offline, since JVM doesn't give you a chance to  instrument preloaded Java core classes in runtime,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;$ java -cp &lt;span style="color: blue;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;i&gt;&lt;span&gt;{msdk-cmd}&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;/lib/ConTest.jar:{$JAVA_HOME/jre/lib} com.ibm.contest.instrumentation.Instrument java.util.jar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;After that, apply MulticoreSDK in the deadlock case again from step 2 above. The deadlock analysis result is shown below,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;a href="" name="listing1"&gt;&lt;b&gt;Listing 1. P&lt;/b&gt;&lt;/a&gt;&lt;b&gt;otential Deadlocks Results from Derby&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;col width="256"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td bgcolor="#c0c0c0" width="100%"&gt;    &lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;Deadlock    Cycle 1: [666, 315]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;#315-&amp;gt;#666    #666-&amp;gt;#315 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge    #315-&amp;gt;#666 consists of:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;     &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Thread    [java.lang.Thread@1909682643]: lock taken at    [java/util/Observable.java:78 deleteObserver(java.util.Observer)    org.apache.derby.impl.store.raw.data.BaseContainerHandle@840]    inside a different lock taken at    [org/apache/derby/impl/store/raw/data/BasePage.java:1720    releaseExclusive()    org.apache.derby.impl.store.raw.data.StoredPage@487]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge    #666-&amp;gt;#315 consists of:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;     &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Thread    [java.lang.Thread@1915449899]: lock taken at    [org/apache/derby/impl/store/raw/data/BasePage.java:1334    isLatched() org.apache.derby.impl.store.raw.data.StoredPage@487]    inside a different lock taken at    [org/apache/derby/impl/store/raw/data/BaseContainerHandle.java:408    close()    org.apache.derby.impl.store.raw.data.BaseContainerHandle@840]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;===================================================&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-style: normal; margin-bottom: 0cm;"&gt; &lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Now MulticoreSDK successfully reports the same deadlock to the &lt;a href="https://issues.apache.org/jira/browse/DERBY-4129"&gt;real deadlock case&lt;/a&gt; despite that the deadlock doesn't surface once in my execution :) &lt;/span&gt;&lt;/span&gt; &lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;strong&gt;MulticoreSDK Tool Link&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;http://www.alphaworks.ibm.com/tech/msdk&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-4053913829750774709?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/4053913829750774709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=4053913829750774709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/4053913829750774709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/4053913829750774709'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2010/02/say-goodbye-to-awful-concurrency-bugs.html' title='Say goodbye to awful concurrency bugs -- Showcase of MulticoreSDK on Derby'/><author><name>Daniel</name><uri>http://www.blogger.com/profile/05900572901770565834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_H5FgRHHkL_M/SXGK4lFeqiI/AAAAAAAAAFw/VbBYeArD3yQ/S220/%E4%B8%AA%E4%BA%BA%E7%85%A7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-5017735890128869627</id><published>2010-02-10T01:47:00.000-08:00</published><updated>2010-02-10T01:59:10.097-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlock'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel error'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrent program'/><title type='text'>Easily find potential deadlocks in concurrent software without reproduction</title><content type='html'>&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Deadlock among Java threads is a common concurrency bug stemming from inappropriate synchronization order. It's a disaster that deadlock can make program permanently unable to make forward progress. What's worse, deadlocks do not manifest themselves predictably and when they do surface, it is often at the worst possible time in production, under heavy load. It means that reproducing deadlock which depends on some lucky timing, can be extremely difficult. So traditional bug fix methodology, reproduce error-&amp;gt;find root cause-&amp;gt;fix bug, is not feasible to fix concurrency bugs without appropriate tool.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=5973770720692284621&amp;amp;postID=5017735890128869627" name="listing1"&gt;&lt;/a&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;A sophisticated method/tool to find potential deadlocks in program without deadlock reproduction is urged. &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;Multicore Software Development Kit&lt;/a&gt; (MulticoreSDK) is the toolkit of this kind.&lt;br /&gt;&lt;br /&gt;The Java sample below simulates &lt;a href="http://en.wikipedia.org/wiki/Dining_philosophers_problem"&gt;dining philosophers problem&lt;/a&gt; which contains potential deadlocks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=5973770720692284621&amp;amp;postID=5017735890128869627" name="listing1"&gt;&lt;b&gt;Listing 1. Dining Philosophers Problem&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" height="1229" style="width: 563px;"&gt;&lt;col width="256"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td bgcolor="#c0c0c0" width="100%"&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;b&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: #7f0055;"&gt;package    &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;sample.deadlock;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    PhiloSample &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;extends&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Thread { &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    = 3;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Table &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;t&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;PhiloSample(&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    id, Table t) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt;    = id;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;t&lt;/span&gt;&lt;span style="color: black;"&gt;    = t;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;                   &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    run() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; Fork    left = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;t&lt;/span&gt;&lt;span style="color: black;"&gt;.getFork(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;synchronized&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (left) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  Fork    right = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;t&lt;/span&gt;&lt;span style="color: black;"&gt;.getFork(&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt;    + 1);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;synchronized&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (right) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;t&lt;/span&gt;&lt;span style="color: black;"&gt;.eatFood();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    main(String args[]) &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;throws&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Exception {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; Table    tab = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Table();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; PhiloSample[]    p = &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    PhiloSample[&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    i = 0; i &amp;lt; &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;;    ++i) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  p[i] =    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    PhiloSample(i, tab);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    i = 0; i &amp;lt; &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;;    ++i)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  p[i].start();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    i = 0; i &amp;lt; &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;;    ++i)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  p[i].join();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Fork {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Table {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Fork    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;forks&lt;/span&gt;&lt;span style="color: black;"&gt;[];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;MAX_EAT&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    = 12;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;eatctr&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Table()    {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;forks&lt;/span&gt;&lt;span style="color: black;"&gt;    = &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Fork[PhiloSample.&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    (&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    i = 0; i &amp;lt; PhiloSample.&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;;    ++i)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;forks&lt;/span&gt;&lt;span style="color: black;"&gt;[i]    = &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Fork();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;eatctr&lt;/span&gt;&lt;span style="color: black;"&gt;    = &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;MAX_EAT&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    Fork getFork(&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    id){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;forks&lt;/span&gt;&lt;span style="color: black;"&gt;[id    % PhiloSample.&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;&lt;i&gt;NUM_PHIL&lt;/i&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;synchronized&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    eatFood() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #0000c0;"&gt;eatctr&lt;/span&gt;&lt;span style="color: black;"&gt;--;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;/span&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;synchronized&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;boolean&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    isDone() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;&lt;span style="color: black;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;    &lt;/span&gt;&lt;span style="color: #0000c0;"&gt;eatctr&lt;/span&gt;&lt;span style="color: black;"&gt;    == 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;       &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Although the code is buggy, the deadlock is not necessarily to manifest all the time in execution, which increase the difficulty to reveal and fix deadlock problem. &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;MulticoreSDK&lt;/a&gt; can be easily used to find potential deadlock in Java program regardless   whether the deadlock occurs or not, with following steps:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Download  &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;MulticoreSDK&lt;/a&gt;  from its website, and install it following the user manual. Suppose  MulticoreSDK is extracted under &lt;span style="color: blue;"&gt;&lt;i&gt;{msdk-cmd}&lt;/i&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Open  &lt;i&gt;KingProperties&lt;/i&gt; file  in &lt;i&gt;props&lt;/i&gt; folder, set  preference &lt;i&gt;targetClasses =  sample/deadlock (with slashes instead of dots),&lt;/i&gt;&lt;span style="font-style: normal;"&gt;  which means the tool will work on classes with prefix  sample.deadlock.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Compile  the sample,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;$ mkdir bin &amp;amp;&amp;amp; javac -d bin PhiloSample.java&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol start="4"&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Run  the sample with MulticoreSDK,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal;"&gt;$ java &lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-style: normal;"&gt;-Dcontest.preferences={msdk-cmd}/prop/KingProperties -javaagent:{msdk-cmd}/lib/ConTest.jar&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt; -cp .:bin sample.deadlock.PhiloSample&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol start="5"&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;If  succeed, &lt;i&gt;com_ibm_contest&lt;/i&gt; folder and trace file  &lt;i&gt;com_ibm_contest/lockDisciplineTraces/lockChains_xxx.trace&lt;/i&gt; are  created.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;Run  post analysis against trace file,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="font-style: normal;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;$ java -Dcontest.deadlockinfo=true -ea -cp ConTest.jar com.ibm.contest.lock_dis_checker.Main .&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;span style="font-style: normal;"&gt;The analysis result is shown below, MulticoreSDK found 1 potential deadlock which  doesn't manifest itself in execution in step 4. From the result, you can see that the deadlock is contributed by 3 locks #1, #2, #3 whose details are listed in lock group section below. &lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge #1-&amp;gt;#2 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;represents certain threads acquired lock #1 followed by acquiring lock #2, and the thread  is &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;Thread&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;  &lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;[com.ibm.amino.multicoresdk.contest.PhiloSample@1599561559]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;({thread instance name}@{thread instance hash code}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-style: normal;"&gt;. It first acquired lock #1  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;com.ibm.amino.multicoresdk.contest.Fork@1 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;({lock instance name}@{ lock instance hash code})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt; at program location &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:18 run()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: blue;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;({filename}:{line number} {method name})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;, then acquired lock #2  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;com.ibm.amino.multicoresdk.contest.Fork@2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monotype Sans WT;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;. The deadlock consists of lock acquisitions from 3 threads and they obtain locks in such tricky order that it forms a deadlock cycle, which should cause concerns.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0cm;"&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=5973770720692284621&amp;amp;postID=5017735890128869627" name="listing1"&gt;&lt;b&gt;Listing 2. P&lt;/b&gt;&lt;/a&gt;&lt;b&gt;otential Deadlocks Results&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" height="899" style="width: 559px;"&gt;&lt;col width="256"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td bgcolor="#c0c0c0" width="100%"&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;Deadlock    Cycle 1: [1, 2, 3]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;#1-&amp;gt;#2    #2-&amp;gt;#3 #3-&amp;gt;#1 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge    #1-&amp;gt;#2 consists of:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;     &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Thread    [com.ibm.amino.multicoresdk.contest.PhiloSample@1599561559]: lock    taken at [com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@2] inside a    different lock taken at    [com/ibm/amino/multicoresdk/contest/PhiloSample.java:16 run()    com.ibm.amino.multicoresdk.contest.Fork@1]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge    #2-&amp;gt;#3 consists of:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;     &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Thread    [com.ibm.amino.multicoresdk.contest.PhiloSample@1602903946]: lock    taken at [com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@4] inside a    different lock taken at    [com/ibm/amino/multicoresdk/contest/PhiloSample.java:16 run()    com.ibm.amino.multicoresdk.contest.Fork@2]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;edge    #3-&amp;gt;#1 consists of:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="border-color: -moz-use-text-color -moz-use-text-color rgb(0, 0, 0); border-style: none none solid; border-width: medium medium 1px; margin-bottom: 0cm; padding: 0cm 0cm 0.07cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;     &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;Thread    [com.ibm.amino.multicoresdk.contest.PhiloSample@1606246333]: lock    taken at [com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@1] inside a    different lock taken at    [com/ibm/amino/multicoresdk/contest/PhiloSample.java:16 run()    com.ibm.amino.multicoresdk.contest.Fork@4]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;===================================================&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="border-color: -moz-use-text-color -moz-use-text-color rgb(0, 0, 0); border-style: none none solid; border-width: medium medium 1px; margin-bottom: 0cm; padding: 0cm 0cm 0.07cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="border-color: -moz-use-text-color -moz-use-text-color rgb(0, 0, 0); border-style: none none solid; border-width: medium medium 1px; margin-bottom: 0cm; padding: 0cm 0cm 0.07cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;Locations    of lock operations were grouped as follows:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;===================================================&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;group    #1:lock [com.ibm.amino.multicoresdk.contest.Fork]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:16    run() com.ibm.amino.multicoresdk.contest.Fork@1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;group    #2:lock [com.ibm.amino.multicoresdk.contest.Fork]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:16    run() com.ibm.amino.multicoresdk.contest.Fork@2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;group    #3:lock [com.ibm.amino.multicoresdk.contest.Fork]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:16    run() com.ibm.amino.multicoresdk.contest.Fork@4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left" style="margin-bottom: 0cm;"&gt;&lt;span style="color: black;"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;      &lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;com/ibm/amino/multicoresdk/contest/PhiloSample.java:18    run() com.ibm.amino.multicoresdk.contest.Fork@4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color: black;"&gt;&lt;span style="font-family: Monospace;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span lang="en-US"&gt;&lt;span style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; background: transparent none repeat scroll 0% 0%;"&gt;===================================================&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;br /&gt;According to analysis result above, you can quickly locate potential deadlocks in your program without reproducing the deadlock in runtime. It makes finding deadlock in concurrent software more easily and effectively since reproducing the deadlock manually can be extremely physical-sensitive work or sometimes mission impossible :) &lt;br /&gt;&lt;b&gt;MulticoreSDK Tool Link&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Monotype Sans WT,serif;"&gt;&lt;span lang="en-US"&gt;&lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;http://www.alphaworks.ibm.com/tech/msdk&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-5017735890128869627?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/5017735890128869627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=5017735890128869627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/5017735890128869627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/5017735890128869627'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2010/02/easily-find-potential-deadlocks-in.html' title='Easily find potential deadlocks in concurrent software without reproduction'/><author><name>Daniel</name><uri>http://www.blogger.com/profile/05900572901770565834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_H5FgRHHkL_M/SXGK4lFeqiI/AAAAAAAAAFw/VbBYeArD3yQ/S220/%E4%B8%AA%E4%BA%BA%E7%85%A7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-8813278091393379983</id><published>2010-01-25T19:21:00.000-08:00</published><updated>2010-01-25T19:21:33.921-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jucprofiler'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='juc'/><title type='text'>jucprofiler : java.util.concurrent locks profiling</title><content type='html'>&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:200%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; punctuation-wrap:simple; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1; mso-list-template-ids:1; mso-list-name:WW8Num3;}@list l0:level1 {mso-level-tab-stop:21.25pt; mso-level-number-position:left; margin-left:21.25pt; text-indent:-21.25pt;}@list l0:level2 {mso-level-text:"%1\.%2\."; mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:1.0cm; text-indent:-1.0cm;}@list l0:level3 {mso-level-text:"%1\.%2\.%3\."; mso-level-tab-stop:35.45pt; mso-level-number-position:left; margin-left:35.45pt; text-indent:-35.45pt;}@list l0:level4 {mso-level-text:"%1\.%2\.%3\.%4\."; mso-level-tab-stop:42.55pt; mso-level-number-position:left; margin-left:42.55pt; text-indent:-42.55pt;}@list l0:level5 {mso-level-text:"%1\.%2\.%3\.%4\.%5\."; mso-level-tab-stop:49.6pt; mso-level-number-position:left; margin-left:49.6pt; text-indent:-49.6pt;}@list l0:level6 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\."; mso-level-tab-stop:2.0cm; mso-level-number-position:left; margin-left:2.0cm; text-indent:-2.0cm;}@list l0:level7 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\."; mso-level-tab-stop:63.8pt; mso-level-number-position:left; margin-left:63.8pt; text-indent:-63.8pt;}@list l0:level8 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\."; mso-level-tab-stop:70.9pt; mso-level-number-position:left; margin-left:70.9pt; text-indent:-70.9pt;}@list l0:level9 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9\."; mso-level-tab-stop:77.95pt; mso-level-number-position:left; margin-left:77.95pt; text-indent:-77.95pt;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;h1 style="margin-left: 21.25pt; text-indent: -21.25pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261119"&gt;&lt;span lang="EN-US"&gt;1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 10.5pt;"&gt;Performance analysis is an important aspect of the application development process.&amp;nbsp; It is typically done by a specialist whose main goal is to improve the code performance on a given platform.&amp;nbsp; This problem becomes even more difficult when dealing with concurrent/multi-threaded applications running on multicore platforms.&amp;nbsp;&amp;nbsp; In such cases, one not only has to worry about code performance but also about the scalability of the code.&amp;nbsp; Different types of code profiling tools are used to help with the overall performance analysis process.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;With the introduction of the java.util.concurrent (JUC) package in Java 5, a new type of lock was introduced into the Java lanaguage.&amp;nbsp; There are no tools available in either IBM or externally to profile JUC locks and provide detailed contention information like those provided by JLM for regular Java locks.&amp;nbsp; Also, usage of the JUC package is becoming more and more popular as more application are either developed or fine tuned to run better on multicore systems.&amp;nbsp; This absence of a JUC lock profiling tool is the motivation behind the development of our lock tool.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;o:smarttagtype name="date" namespaceuri="urn:schemas-microsoft-com:office:smarttags"&gt;&lt;/o:smarttagtype&gt;&lt;o:smarttagtype name="time" namespaceuri="urn:schemas-microsoft-com:office:smarttags"&gt;&lt;/o:smarttagtype&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:200%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; punctuation-wrap:simple; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h2 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; punctuation-wrap:simple; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h3 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:3; punctuation-wrap:simple; font-size:16.0pt; font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1; mso-list-template-ids:1; mso-list-name:WW8Num3;}@list l0:level1 {mso-level-tab-stop:21.25pt; mso-level-number-position:left; margin-left:21.25pt; text-indent:-21.25pt;}@list l0:level2 {mso-level-text:"%1\.%2\."; mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:1.0cm; text-indent:-1.0cm;}@list l0:level3 {mso-level-text:"%1\.%2\.%3\."; mso-level-tab-stop:35.45pt; mso-level-number-position:left; margin-left:35.45pt; text-indent:-35.45pt;}@list l0:level4 {mso-level-text:"%1\.%2\.%3\.%4\."; mso-level-tab-stop:42.55pt; mso-level-number-position:left; margin-left:42.55pt; text-indent:-42.55pt;}@list l0:level5 {mso-level-text:"%1\.%2\.%3\.%4\.%5\."; mso-level-tab-stop:49.6pt; mso-level-number-position:left; margin-left:49.6pt; text-indent:-49.6pt;}@list l0:level6 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\."; mso-level-tab-stop:2.0cm; mso-level-number-position:left; margin-left:2.0cm; text-indent:-2.0cm;}@list l0:level7 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\."; mso-level-tab-stop:63.8pt; mso-level-number-position:left; margin-left:63.8pt; text-indent:-63.8pt;}@list l0:level8 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\."; mso-level-tab-stop:70.9pt; mso-level-number-position:left; margin-left:70.9pt; text-indent:-70.9pt;}@list l0:level9 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9\."; mso-level-tab-stop:77.95pt; mso-level-number-position:left; margin-left:77.95pt; text-indent:-77.95pt;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;h1 style="margin-left: 21.25pt; text-indent: -21.25pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261120"&gt;&lt;span lang="EN-US"&gt;2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Short Overview of jucprofiler&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;In juc lock, thread will “stop” execution by following two cases,&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;1 When a thread A tries to acquire a juc lock, while this lock has been acquired by other thread.&amp;nbsp; Then thread A has to “stop” its execution, and wait until this lock is released, or time out.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;2. When a thread A invokes one of “wait” APIs of java.util.concurrent.locks.Condition, thread A “stop” its execution, until other thread notifies it, or time out.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Let us note the time usage in first case as &lt;i&gt;Contention Time&lt;/i&gt;, the second case as &lt;i&gt;Wait Time&lt;/i&gt;,&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Juc profiler is designed and implemented to capture the time usage of two kinds.&lt;/span&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261121"&gt;&lt;span lang="EN-US"&gt;2.1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Instrumentation&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;w:wrap type="square"&gt; &lt;/w:wrap&gt;&lt;span lang="EN-US"&gt;In order to capture the juc lock runtime data, several juc classes are instrumented offline, and replace original classes in JRE.&amp;nbsp; Before jucprofiler is used in the first time, user has to run a command to generate PreInstrument.jar.&amp;nbsp; This step can only be done once, if JRE is not changed.&amp;nbsp; If users change to another JRE, users have to remove &lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;PreInstrument.jar&lt;/span&gt;, and re-run this command to generate &lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;PreInstrument.jar&lt;/span&gt; again.&lt;/span&gt;  &lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="margin-left: 35.45pt; text-indent: -35.45pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261122"&gt;&lt;span lang="EN-US"&gt;2.1.1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Contention Time&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div align="left" class="MsoNormal" style="text-align: left;"&gt;&lt;span lang="EN-US"&gt;We record the allocation of &lt;/span&gt;&lt;span lang="EN-US" style="font-size: 9pt;"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer &lt;/span&gt;and &lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject&lt;/span&gt;, and assign unique id to them.&amp;nbsp; For the time usage on lock, we capture the time usage of invoking park(blocker) and parkNanos(blocker, nanos) in class java.util.concurrent.locks.LockSupport, when these two methods are invoked in different places,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: -0.25pt;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="border-color: black -moz-use-text-color black black; border-style: solid none solid solid; border-width: 1pt medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Class&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: black -moz-use-text-color black black; border-style: solid none solid solid; border-width: 1pt medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Methods&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Call Site&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 9pt;"&gt;java.util.concurrent.locks.LockSupport&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;park (Object);&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;parkAndCheckInterrupt() in class AbstractQueuedSynchronizer&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;parkNanos(Object blocker, long nanos)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="FR"&gt;doAcquireNanos(int   arg, long nanosTimeout)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;doAcquireSharedNanos(int arg, long   nanosTimeout) in class AbstractQueuedSynchronizer&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="margin-left: 35.45pt; text-indent: -35.45pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261123"&gt;&lt;span lang="EN-US"&gt;2.1.2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Wait Time&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="border-collapse: collapse; margin-left: -0.25pt;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="border-color: black -moz-use-text-color black black; border-style: solid none solid solid; border-width: 1pt medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Class&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: black -moz-use-text-color black black; border-style: solid none solid solid; border-width: 1pt medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Methods&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Call Site&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 9pt;"&gt;java.util.concurrent.locks.LockSupport&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;park (Object);&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal" style="margin-left: 5.25pt; text-indent: -5.25pt;"&gt;&lt;span lang="EN-US"&gt;Other methods than parkAndCheckInterrupt() in class AbstractQueuedSynchronizer&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 151.3pt;" valign="top" width="202"&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color -moz-use-text-color black black; border-style: none none solid solid; border-width: medium medium 1pt 1pt; padding: 0cm 5.4pt; width: 133.8pt;" valign="top" width="178"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;parkNanos(Object blocker, long nanos)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 141.5pt;" valign="top" width="189"&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Other methods than doAcquireNanos(int   arg, long nanosTimeout)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;doAcquireSharedNanos(int arg, long   nanosTimeout) in class AbstractQueuedSynchronizer&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 10.5pt;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h1 {mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:200%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; punctuation-wrap:simple; font-size:22.0pt; font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h2 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; punctuation-wrap:simple; font-size:16.0pt; font-family:Arial; mso-fareast-font-family:黑体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}h3 {mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:172%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:3; punctuation-wrap:simple; font-size:16.0pt; font-family:"Times New Roman"; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;}span.1CharChar {mso-style-name:"标题 1 Char Char"; mso-ansi-font-size:22.0pt; mso-bidi-font-size:22.0pt; font-family:宋体; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-ansi-language:EN-US; mso-fareast-language:AR-SA; mso-bidi-language:AR-SA; font-weight:bold;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:595.25pt 841.85pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0; layout-grid:15.6pt;}div.Section1 {page:Section1; mso-footnote-position:beneath-text;} /* List Definitions */ @list l0 {mso-list-id:1; mso-list-template-ids:1; mso-list-name:WW8Num3;}@list l0:level1 {mso-level-tab-stop:21.25pt; mso-level-number-position:left; margin-left:21.25pt; text-indent:-21.25pt;}@list l0:level2 {mso-level-text:"%1\.%2\."; mso-level-tab-stop:1.0cm; mso-level-number-position:left; margin-left:1.0cm; text-indent:-1.0cm;}@list l0:level3 {mso-level-text:"%1\.%2\.%3\."; mso-level-tab-stop:35.45pt; mso-level-number-position:left; margin-left:35.45pt; text-indent:-35.45pt;}@list l0:level4 {mso-level-text:"%1\.%2\.%3\.%4\."; mso-level-tab-stop:42.55pt; mso-level-number-position:left; margin-left:42.55pt; text-indent:-42.55pt;}@list l0:level5 {mso-level-text:"%1\.%2\.%3\.%4\.%5\."; mso-level-tab-stop:49.6pt; mso-level-number-position:left; margin-left:49.6pt; text-indent:-49.6pt;}@list l0:level6 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\."; mso-level-tab-stop:2.0cm; mso-level-number-position:left; margin-left:2.0cm; text-indent:-2.0cm;}@list l0:level7 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\."; mso-level-tab-stop:63.8pt; mso-level-number-position:left; margin-left:63.8pt; text-indent:-63.8pt;}@list l0:level8 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\."; mso-level-tab-stop:70.9pt; mso-level-number-position:left; margin-left:70.9pt; text-indent:-70.9pt;}@list l0:level9 {mso-level-text:"%1\.%2\.%3\.%4\.%5\.%6\.%7\.%8\.%9\."; mso-level-tab-stop:77.95pt; mso-level-number-position:left; margin-left:77.95pt; text-indent:-77.95pt;}ol {margin-bottom:0cm;}ul {margin-bottom:0cm;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;h1 style="margin-left: 21.25pt; text-indent: -21.25pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261124"&gt;&lt;span lang="EN-US"&gt;3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;How to use jucprofiler&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/h1&gt;&lt;h2 style="margin-left: 1cm; text-indent: -1cm;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261125"&gt;&lt;span lang="EN-US"&gt;3.1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Run juc profiler&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;JUC profiler can be used for any java program on JDK 6.&amp;nbsp; Setting parameters to run, supposing juc profiler is installed in directory $JUCP.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;java -Xbootclasspath/p:$JUCP/BCIRuntime.jar:$JUCP/PreInstrument.jar -javaagent:$JUCP/BCIAgent.jar=logger=trace:callStackDepth=10:allocationStackDepth=0:libPath=$JUCP:traceJUC=on -cp .:derby.jar JavaDBDemo&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;  &lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;After finish running Juc profiler with your program, a trace file named "BCIAgent.***.bci.trace" will be generated, which "***" is a unique time stamp for this execution.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="margin-left: 1cm; text-indent: -1cm;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261126"&gt;&lt;span lang="EN-US"&gt;3.2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Trace post process&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Run command shown below to get Juc profiling result.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span lang="EN-US"&gt;$ java -Xmx1000m -jar $JUCP/BCITraceReader.jar {tracefile} {resultOutputFile} &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Where, {tracefile} is the full path of trace file or directory contains trace files, such as BCIAgent.***.bci.trace. {resultOutputFile} is an optional option to set file to store the analysis results, if omitting this option, the analysis results will be printed in console.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Note: The post analysis process to trace file may suffer from some memory overhead, it's better to increase process heap size via -Xmx Java option. In our experiment, analyzing a 160M trace may consume 800M memory.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="margin-left: 1cm; text-indent: -1cm;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261127"&gt;&lt;span lang="EN-US"&gt;3.3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Understand profiling result&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;As figure shown below, the plain text output includes kinds of information, such as lock name, lock contention count and time, lock hold time and count, lock allocation stack trace, duration and stack trace of each lock contention, etc. The result can help user find out the Juc lock contention bottleneck in program.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Before “LEGEND” section, the profiling result report first summarizes all juc lock contentions in program, descending sorted by lock contention count, then contention time. Each summary row item belongs to one of two different types, “AQS” for individual juc lock and “CHM” for ConcurrentHashMap. Since a ConcurrentHashMap is divided by several Segment(s) for elements storage and each Segment is protected by a different juc lock, a ConcurrentHashMap can be viewed as a composition of juc locks from lock perspective. E.g. “CHM@8” below has contention count 276 and contention time 39457000, means that total contention count of all segments locks in “CHM@8” is 276, total contention time of all segments locks in “CHM@8” is 39457000 nanoseconds. This locks grouping helps programmers to identity in which ConcurrentHashMap object the most serious juc lock contentions occur. On the other side, look at the individual juc lock “AQS@1790”, it doesn’t belong to any ConcurrentHashMap object and this lock is used explicitly in program. Note that because lock hold events are not enabled in the example trace, 0 is put in columns HOLD-COUNT and HOLD-TIME.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;After “LEGEND” section, the profiling result reports details of each juc lock contention. As result snippet below, for ConcurrentHashMap “CHM@8”, lock contention happens in two segment locks “Lock [AQS@135]” and “Lock [AQS@146]”. For “Lock [AQS@135]”, it contends in one place, follows by contention count, contention time, and full stack back trace of the contention. So does “Lock [AQS@146]”. These details help programmers to locate the lock contention in program and clearly understand which segments of ConcurrentHashMap contend most.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="FR" style="font-size: 7.5pt;"&gt;Lock [AQS@135]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="FR" style="font-size: 7.5pt;"&gt;-----------------------------------------------------------------------------------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="FR" style="font-size: 7.5pt;"&gt;Lock Contention 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-COUNT: 25&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-TIME:     10827000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Call Stack:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:758)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:789)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1125)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:197)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:273)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:530)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:934)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlock(ConcurrentLockSet.java:740)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlockReference(ConcurrentLockSet.java:784)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.LockSpace.unlockReference(LockSpace.java:275)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;End of Lock     [AQS@135]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;**************************************************************************************************************&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #444444; color: lime;"&gt;&lt;w:wrap type="square"&gt; &lt;/w:wrap&gt;&lt;o:p&gt;&lt;/o:p&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Lock Contention     1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-COUNT: 22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-TIME:     2009000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Call Stack:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:758)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:789)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1125)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:197)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:273)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:530)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:934)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlock(ConcurrentLockSet.java:740)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlockReference(ConcurrentLockSet.java:784)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;&lt;span style="background-color: #444444; color: lime;"&gt;org.apache.derby.impl.services.locks.LockSpace.unlockReference(LockSpace.java:275)&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;w:wrap type="square"&gt; &lt;/w:wrap&gt;&lt;o:p&gt;&lt;/o:p&gt;  &lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;Multicore Software Development Tookit Version_2.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;j.u.c Lock Profiler Report&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTD-COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTD-TIME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HOLD-COUNT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HOLD-TIME&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CHM@8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 276&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 39457000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AQS@1790&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4029000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AQS@131&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 630000&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;=================================================================================================&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;LEGEND:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NAME : Name of juc lock(AQS) or ConcurrentHashMap(CHM), format: &lt;type&gt;@&lt;id&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/id&gt;&lt;/type&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTD-COUNT : Total count of lock contention&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CONTD-TIME : Total time of lock contention in nanosecond&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HOLD-COUNT : Total count of lock hold&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HOLD-TIME : Total time of lock hold in nanosecond&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;==================================================================================================&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;ConcurrentHashMap [CHM@8]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;-----------------------------------------------------------------------------------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;Lock [AQS@135]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;-----------------------------------------------------------------------------------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="FR"&gt;Lock Contention 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;CONTD-COUNT: 25&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;CONTD-TIME: 10827000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;Call Stack:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:758)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:789)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1125)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:197)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:273)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:530)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:934)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlock(ConcurrentLockSet.java:740)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlockReference(ConcurrentLockSet.java:784)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;org.apache.derby.impl.services.locks.LockSpace.unlockReference(LockSpace.java:275)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span lang="EN-US"&gt;End of Lock [AQS@135]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;&lt;span style="background-color: #444444; color: lime; font-family: Verdana,sans-serif; font-size: xx-small;"&gt;************************************************************************************************************** &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;&lt;span style="background-color: #444444; color: lime; font-family: Verdana,sans-serif; font-size: xx-small;"&gt;&lt;span style="background-color: white;"&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Lock [AQS@146]:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;-----------------------------------------------------------------------------------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Lock Contention 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-COUNT: 22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;CONTD-TIME: 2009000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;Call Stack:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:758)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:789)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1125)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:197)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:273)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap$Segment.remove(ConcurrentHashMap.java:530)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;java.util.concurrent.ConcurrentHashMap.remove(ConcurrentHashMap.java:934)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlock(ConcurrentLockSet.java:740)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;org.apache.derby.impl.services.locks.ConcurrentLockSet.unlockReference(ConcurrentLockSet.java:784)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;&lt;span style="background-color: #444444; color: lime;"&gt;org.apache.derby.impl.services.locks.LockSpace.unlockReference(LockSpace.java:275)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-size: 7.5pt;"&gt;&lt;span style="background-color: #444444; color: lime;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 style="margin-left: 1cm; text-indent: -1cm;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261128"&gt;3.4.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;span dir="LTR"&gt;Open trace file in Visual Analyzer&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;There are some views developed in Eclipse to show jucprofiler trace file with tables and figures, which is called Visual Analzyer.&amp;nbsp; Currently, there are two views for jucprofiler, one is “J.U.C statistics” view, and the other is “J.U.C synchornization view”.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;“J.U.C statistics” view is shown as below.&amp;nbsp; Two columns in right-most are “Contention Times” and “Contention Counts”.&amp;nbsp; “Allocation Stack” column is about the allcation call site of JUC locks.&lt;br /&gt;&lt;/div&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 10.5pt;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_QnrL2ss4ZYY/S15Ikd6djuI/AAAAAAAAAAM/BYPI9CT6KcM/s1600-h/juc.derby.statistic.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="444" src="http://3.bp.blogspot.com/_QnrL2ss4ZYY/S15Ikd6djuI/AAAAAAAAAAM/BYPI9CT6KcM/s640/juc.derby.statistic.JPG" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;“J.U.C synchronization” view is shown as below.&amp;nbsp; The first lane is Time, indicating when this lock contention occurs.&amp;nbsp; The second lane is Thread, indicating which thread occurs lock contention.&amp;nbsp; The third lane is Monitor, indicating which JUC lock is contented.&amp;nbsp; The last lane is Method, indicating where does the lock contend.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_QnrL2ss4ZYY/S15Ivp5XkbI/AAAAAAAAAAU/iV40eQRzAhc/s1600-h/juc.derby.sync.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://2.bp.blogspot.com/_QnrL2ss4ZYY/S15Ivp5XkbI/AAAAAAAAAAU/iV40eQRzAhc/s400/juc.derby.sync.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="margin-left: 1cm; text-indent: -1cm;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261129"&gt;&lt;span lang="EN-US"&gt;3.5.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Online control&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;During the runing, juc profiler will create a ControlServer listening on port 2009. User can use ControlClient to connect that port and control the behavior of juc profiler, e.g. the trace can be turned on and off on-the-fly,&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;$ java -cp BCIRuntime.jar com.ibm.msdk.bciruntime.control.ControlClient HOST -m [b|i] -b START -e END&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;HOST&lt;/b&gt;: host name that ControlClient wants to connect to, default is localhost.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;-m [b|i]&lt;/b&gt;: Mode of ControlClient. b means batch mode, while i means interative mode. In default is interative mode.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;-b START&lt;/b&gt;: if mode is set to batch mode, START is the time(second) you want to start profiling.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;b&gt;-e END&lt;/b&gt;: END is the duration time(second) you want to profiling.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="margin-left: 35.45pt; text-indent: -35.45pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261130"&gt;&lt;span lang="EN-US"&gt;3.5.1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Interactive mode&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;A simple shell is provided, and user can type command juc.on and juc.off to turn on and off juc profiler. For example, java -cp BCIRuntime.jar com.ibm.msdk.bciruntime.control.ControlClient, ControlClient will connect to localhost, and open a shell to control juc profiler.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;$ java -cp BCIRuntime.jar com.ibm.msdk.bciruntime.control.ControlClient&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;jucprofiler&lt;/span&gt;&lt;span lang="EN-US"&gt; control&amp;gt; juc.on&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;juc.on&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;jucprofiler&lt;/span&gt;&lt;span lang="EN-US"&gt; t control&amp;gt; start&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;start&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;jucprofiler&lt;/span&gt;&lt;span lang="EN-US"&gt; control&amp;gt;; stop&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;stop&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;jucprofiler&lt;/span&gt;&lt;span lang="EN-US"&gt; control&amp;gt; juc.off&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime;"&gt;&lt;span lang="FR"&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;juc.off&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;  &lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="margin-left: 35.45pt; text-indent: -35.45pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261131"&gt;&lt;span lang="EN-US"&gt;3.5.2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US"&gt;Batch mode&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="MsoNormal"&gt;&lt;style&gt;&lt;!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}@font-face {font-family:"\@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; punctuation-wrap:simple; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:.5pt; mso-fareast-language:AR-SA;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;}@page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;}div.Section1 {page:Section1;}--&gt;&lt;/style&gt;  &lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;$ java -cp BCIRuntime.jar com.ibm.msdk.bciruntime.control.ControlClient localhost -m b -b 2 -e 10&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;Start tracing in 2 seconds&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;Start tracing&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;Stop tracing in 10 seconds&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;Stop tracing&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="background-color: #444444; color: lime; font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span lang="EN-US"&gt;quit&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;  &lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;commands can be executed in batch mode. For example, &lt;i&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;java -cp BCIRuntime.jar com.ibm.msdk.bciruntime.control.ControlClient mtrat-test.dyndns.org -m b -b 10 -e 10&lt;/span&gt;&lt;/i&gt;, means ControlClient will connect to machine mtrat-test.dyndns.org, start profiler after 10 seconds, and profiling 10 seconds.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 style="margin-left: 21.25pt; text-indent: -21.25pt;"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=5973770720692284621" name="_Toc252261132"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;4.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size-adjust: none; font-size: 7pt; font-stretch: normal; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span dir="LTR"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;Conclusions&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;With the popularity of multicores, more and more concurrent/multi-threaded Java applications will be developed.&amp;nbsp; We need better tools for profiling such concurrent applications.&amp;nbsp; The jucprofiler described in this article fulfills one of the key gaps in Java profiling tools.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&amp;nbsp;Both jucprofiler and VisualAnalzyer can be downloaded from &lt;a href="http://www.alphaworks.ibm.com/tech/msdk"&gt;http://www.alphaworks.ibm.com/tech/msdk&lt;/a&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;; font-size: 10.5pt;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-8813278091393379983?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/8813278091393379983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=8813278091393379983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/8813278091393379983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/8813278091393379983'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2010/01/jucprofiler-javautilconcurrent-locks.html' title='jucprofiler : java.util.concurrent locks profiling'/><author><name>Yao Qi</name><uri>http://www.blogger.com/profile/17304401300323253405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_QnrL2ss4ZYY/S_tZZyBNKFI/AAAAAAAAABQ/_hBv2rRl2gU/S220/qiyao.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QnrL2ss4ZYY/S15Ikd6djuI/AAAAAAAAAAM/BYPI9CT6KcM/s72-c/juc.derby.statistic.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-1713500186578181156</id><published>2009-08-31T00:30:00.000-07:00</published><updated>2009-09-24T23:18:19.169-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><title type='text'>Lock-free Deque in Amino project</title><content type='html'>At fist, Amino Deque implements the algorithm invented by Maged M. Michael in the great paper "CAS-Based Lock-Free Algorithm for Shared Deques".&lt;br /&gt;&lt;br /&gt;The deque is a doublely ended queue. Insertion and deletion can happen at both  ends. Internally, this deque is represented as a doubly linked list. For each deque, there is an anchor object which comprise of 2 pointers and 1 flag. The pseudo-code is as shown below:&lt;br /&gt;&lt;blockquote&gt;Anchor{&lt;br /&gt;Node left, right;&lt;br /&gt;enum {STABLE, LEFT, RIGHT} flag;&lt;br /&gt;} anchor;&lt;br /&gt;&lt;/blockquote&gt;The key idea of this deque algorithm is to automatically updating this anchor field when deque is being changed. An anchor object occupies more than a machine word. Until now, there is no portable way to automatically updating such an "wide" object in Java. Actually, we don't need a wider "CAS" for implementing lock free deque. The idea is simple:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We make Anchor immutable and use an AtomicReference to wrap it&lt;/li&gt;&lt;li&gt;Whenever we want to update an anchor, we create a new Anchor object and use AtomicReference.compareAndSwap() to update the anchor automatically.&lt;/li&gt;&lt;/ol&gt;Above approach behaves differently as a wider "CAS" for some special cases. For example, it will judge equalism by comparing identity. It means even two objects has exactly same internal states, "CAS" will fail in comparison phase.&lt;br /&gt;Besides, there is an object allocated for each updating. Will this be a big overhead? Since memory allocation in Java is relatively cheaper than other languages, this approach works well when frequency is moderate. Performance charts are shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SpuJrp68MtI/AAAAAAAAB8I/EFU6Dau7CuI/s1600-h/LinkedBlockingDeque_LockFreeDeque_read99write1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SpuJrp68MtI/AAAAAAAAB8I/EFU6Dau7CuI/s400/LinkedBlockingDeque_LockFreeDeque_read99write1.png" alt="" id="BLOGGER_PHOTO_ID_5376041963277267666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BswWlutyN3g/SpuJr7dsHRI/AAAAAAAAB8Q/1C466diGZdA/s1600-h/LinkedBlockingDeque_LockFreeDeque_read95write5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_BswWlutyN3g/SpuJr7dsHRI/AAAAAAAAB8Q/1C466diGZdA/s400/LinkedBlockingDeque_LockFreeDeque_read95write5.png" alt="" id="BLOGGER_PHOTO_ID_5376041967986416914" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SpuJsc0RCKI/AAAAAAAAB8Y/zMNZeQGD2W8/s1600-h/LinkedBlockingDeque_LockFreeDeque_read75write25.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SpuJsc0RCKI/AAAAAAAAB8Y/zMNZeQGD2W8/s400/LinkedBlockingDeque_LockFreeDeque_read75write25.png" alt="" id="BLOGGER_PHOTO_ID_5376041976939481250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This deque is not completely compatible with standard JDK API. For example, it doesn't support element deletion by iterator.remove(). This is normal to Amino lock-free components. To implement such an unusual method for deque, performance of other frequently used methods such as addFirst()/pollFirst()/addLast()/pollLast() will become much slower than before. That's the reason why Amino library choose not to support such methods. I personally don't think it's a big problem. After all, if a data structure supports deletion in the middle, can it still be called a deque/queue/stack?&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-1713500186578181156?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/1713500186578181156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=1713500186578181156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1713500186578181156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1713500186578181156'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/08/lock-free-deque-in-amino-project.html' title='Lock-free Deque in Amino project'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BswWlutyN3g/SpuJrp68MtI/AAAAAAAAB8I/EFU6Dau7CuI/s72-c/LinkedBlockingDeque_LockFreeDeque_read99write1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-7889070283796340441</id><published>2009-08-11T01:35:00.000-07:00</published><updated>2009-08-26T07:49:18.547-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><title type='text'>Performance of Amino Queue</title><content type='html'>Now we got the performance result of Amino Queue in an 8-core X86 machine which is running Linux and IBM JDK v6. We compared the performance of Amino's LockFreeQueue and java.util.concurrent.ConcurrentLinkedQueue. Both of the two queues used lock-free algorithm. Amino queue's algorithm comes from the brilliant paper "&lt;span style="font-weight: bold;"&gt;An Optimistic Approach to Lock-Free&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; FIFO Queues&lt;/span&gt;" of Edya Ladan-Mozes and Nir Shavit. Result of the micro-benchmark shows Amino queue has some advantage:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BswWlutyN3g/SoEt6rr9hqI/AAAAAAAAB68/mgMhmd_Rru0/s1600-h/ConcurrentLinkedQueue_LockFreeQueue_QueueEnDePairTest.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 432px; height: 324px;" src="http://3.bp.blogspot.com/_BswWlutyN3g/SoEt6rr9hqI/AAAAAAAAB68/mgMhmd_Rru0/s400/ConcurrentLinkedQueue_LockFreeQueue_QueueEnDePairTest.png" alt="" id="BLOGGER_PHOTO_ID_5368622716985116322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The key idea behind the new algorithm is a novel way of replacing the  singly-linked list of Michael and Scott, whose pointers are inserted using a costly compare-and-swap (CAS) operation, by an optimistic doubly-linked list, whose pointers are updated using a simple store, yet can be fixed if a bad  ordering of events causes them to be inconsistent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-7889070283796340441?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/7889070283796340441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=7889070283796340441' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/7889070283796340441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/7889070283796340441'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/08/performance-of-amino-queue.html' title='Performance of Amino Queue'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_BswWlutyN3g/SoEt6rr9hqI/AAAAAAAAB68/mgMhmd_Rru0/s72-c/ConcurrentLinkedQueue_LockFreeQueue_QueueEnDePairTest.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-7936516635268456708</id><published>2009-08-04T22:30:00.000-07:00</published><updated>2009-08-04T22:44:29.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><title type='text'>Performance of Amino Stack</title><content type='html'>In Amino library, stack is the simplest and yet the most useful component. According to our performance test, Amino's stack is far more faster than a lock-protected stack. Today I rerun the performance test on a 8-core X86-64 machine and result is as shown in below diagrams:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BswWlutyN3g/SnkaBKvB-JI/AAAAAAAAB60/gyhU9Ut2UsQ/s1600-h/JDKStack_LockFreeStack_read100write0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_BswWlutyN3g/SnkaBKvB-JI/AAAAAAAAB60/gyhU9Ut2UsQ/s400/JDKStack_LockFreeStack_read100write0.png" alt="" id="BLOGGER_PHOTO_ID_5366349038352464018" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BswWlutyN3g/SnkaAw4s8PI/AAAAAAAAB6s/4TJ5EIC0_hI/s1600-h/JDKStack_LockFreeStack_read99write1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_BswWlutyN3g/SnkaAw4s8PI/AAAAAAAAB6s/4TJ5EIC0_hI/s400/JDKStack_LockFreeStack_read99write1.png" alt="" id="BLOGGER_PHOTO_ID_5366349031413706994" border="0" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZtFewFfI/AAAAAAAAB6k/ZscVz89EAtM/s1600-h/JDKStack_LockFreeStack_read95write5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZtFewFfI/AAAAAAAAB6k/ZscVz89EAtM/s400/JDKStack_LockFreeStack_read95write5.png" alt="" id="BLOGGER_PHOTO_ID_5366348693344622066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZsjXiQhI/AAAAAAAAB6c/NuHqN2CTZ58/s1600-h/JDKStack_LockFreeStack_read90write10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZsjXiQhI/AAAAAAAAB6c/NuHqN2CTZ58/s400/JDKStack_LockFreeStack_read90write10.png" alt="" id="BLOGGER_PHOTO_ID_5366348684187550226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BswWlutyN3g/SnkZsZdtJ7I/AAAAAAAAB6U/C6kn41tfnuM/s1600-h/JDKStack_LockFreeStack_read75write25.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_BswWlutyN3g/SnkZsZdtJ7I/AAAAAAAAB6U/C6kn41tfnuM/s400/JDKStack_LockFreeStack_read75write25.png" alt="" id="BLOGGER_PHOTO_ID_5366348681529075634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZsUFDRHI/AAAAAAAAB6M/ZRa_Ph1d7c0/s1600-h/JDKStack_LockFreeStack_read50write50.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SnkZsUFDRHI/AAAAAAAAB6M/ZRa_Ph1d7c0/s400/JDKStack_LockFreeStack_read50write50.png" alt="" id="BLOGGER_PHOTO_ID_5366348680083489906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BswWlutyN3g/SnkZsBru0XI/AAAAAAAAB6E/rQoujHsUSvI/s1600-h/JDKStack_LockFreeStack_read0write100.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_BswWlutyN3g/SnkZsBru0XI/AAAAAAAAB6E/rQoujHsUSvI/s400/JDKStack_LockFreeStack_read0write100.png" alt="" id="BLOGGER_PHOTO_ID_5366348675145453938" border="0" /&gt;&lt;/a&gt;In the performance test, the 1st step is warm-up with 8 threads. That's the reason that first column of every bar charts has a label of "8". After that, we increase the thread number from "1" to "128".  The test complete in 1,039.557 second.&lt;br /&gt;&lt;br /&gt;The code (Apache license)  of LockFreeStack can be downloaded at &lt;a href="https://amino-cbbs.svn.sourceforge.net/svnroot/amino-cbbs/trunk/amino/java/src/main/java/org/amino/ds/lockfree/LockFreeIndexedStack.java"&gt;Amino's SF.net SVN&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-7936516635268456708?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/7936516635268456708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=7936516635268456708' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/7936516635268456708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/7936516635268456708'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/08/performance-of-amino-stack.html' title='Performance of Amino Stack'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_BswWlutyN3g/SnkaBKvB-JI/AAAAAAAAB60/gyhU9Ut2UsQ/s72-c/JDKStack_LockFreeStack_read100write0.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-9075913462738081589</id><published>2009-06-08T23:33:00.000-07:00</published><updated>2009-06-11T00:27:32.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Performance Improvement in Amino C++ Library</title><content type='html'>In version 0.5.1, major improvement of Amino C++ library is about performance. Now performance of many data structures are relatively improved. The biggest improvement is the LockFreeList and LockFreeOrderedList. Each of them has made nearly 100% improvements on PPC.&lt;br /&gt;&lt;br /&gt;The steps for performance tuning are as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Profile all the original data structure under X86 and PPC. ( Use oprofile under X86, tprof under PPC)&lt;/li&gt;&lt;li&gt;Analyze the oprofile results and tprof results of *.etm files by VPA (Virtual Performance Analyzer) tool. Find the bottle neck and infer the possible reason.&lt;/li&gt;&lt;li&gt;Trace back to source code to fix the bottle necks get from step 2.&lt;/li&gt;&lt;li&gt;Retest the data structure with different scale of operation numbers, meanwhile fix bugs if any. Compare the performance with the original one.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;All the performance tests have been done on X86 and PowerPC servers after bug fixing and code refine, and the performance is evaluated by the throughput per second. The approximate average improvements of all the C++ data structures are as follows.&lt;br /&gt;&lt;br /&gt;  &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;  &lt;table style="color: rgb(0, 0, 0);" width="560" border="1" cellpadding="7" cellspacing="0"&gt;  &lt;col width="232"&gt;  &lt;col width="154"&gt;  &lt;col width="130"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td rowspan="2" width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;Data    Structure&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td colspan="2" width="298"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;Performance    Improved &lt;/span&gt;&lt;/span&gt;    &lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;X86&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;PPC&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeStack&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:宋体,SimSun;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;50%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:宋体,SimSun;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;31%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeEBStack&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:宋体,SimSun;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;30%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeQueue&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeShavit-Queue&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:宋体,SimSun;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;LockFreeDeque&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;33%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;298%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeList&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;20%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;100%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeOrderedList&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;N/A&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;132%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="232"&gt;    &lt;p style="widows: 2; orphans: 2;" align="left"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;LockFreeSet&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="154"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;40%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="130"&gt;    &lt;p style="widows: 2; orphans: 2;" align="center"&gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;span style="font-size:100%;"&gt;90%&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;                    Diagram 1 Performance average improvements ratio&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Some explanation about the diagram:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The figures are approximate ones which only show the improvement degree.&lt;/li&gt;&lt;li&gt;LockFreeDeque’s huge improvement on PPC because of its implementation originally is not lock free. This time it was re-implemented in lock free way.&lt;/li&gt;&lt;li&gt;Because of the hardware difference, the performance improvement figures are not the same between X86 and PPC.&lt;/li&gt;&lt;/ol&gt;The performance chart of LockFreeOrderedList:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gKoHkNBphe0/Si4QFK4GcnI/AAAAAAAAACk/PJR_3t01fIY/s1600-h/Diagram2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 450px; height: 300px;" src="http://3.bp.blogspot.com/_gKoHkNBphe0/Si4QFK4GcnI/AAAAAAAAACk/PJR_3t01fIY/s320/Diagram2.PNG" alt="" id="BLOGGER_PHOTO_ID_5345227488740405874" border="0" /&gt;&lt;/a&gt;                 Diagram 2 Original performance of LockFreeOrderedList on PPC.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_gKoHkNBphe0/Si4QgU9NWbI/AAAAAAAAACs/DXAc16oKboI/s1600-h/Diagram3.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 450px; height: 300px;" src="http://3.bp.blogspot.com/_gKoHkNBphe0/Si4QgU9NWbI/AAAAAAAAACs/DXAc16oKboI/s320/Diagram3.PNG" alt="" id="BLOGGER_PHOTO_ID_5345227955302652338" border="0" /&gt;&lt;/a&gt;                 Diagram 3 Tuned performance of LockFreeOrderedList on PPC&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The main points for improving the performance are as follows:&lt;br /&gt;&lt;br /&gt;1.Change the improper memory order type.&lt;br /&gt;&lt;blockquote&gt;As we know, the overhead time of lock free components are mainly on the synchronization of atomic operations, such as CAS, LL/SC, whereas these operations are mainly controlled by the memory ordering types. The memory order has five different types (memory_order_relaxed, memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_seq_cs), and the sequential requirements of them becomes stronger as the given sequence. So if misuse the memory order type could waste a lot of time for synchronization.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;2.Fixing bugs.&lt;br /&gt;&lt;blockquote&gt;There are some tough bugs existed before I did the performance tuning which could lead to get wrong performance data.&lt;br /&gt;For example, there are peekTop() functions in LockFreeStack, the original implementation didn’t protect the top pointer and get the value of top-&gt;data. It’s possible the top pointer had been deleted before the operation of top-&gt;data. Because of no protection by SMR, there is no synchronization, so the performance result is wrong.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;3.Refine redundant code.&lt;br /&gt;&lt;blockquote&gt;Some codes can be refined to be more succinct while the logic is not changed, especially for the time-consuming loop sections.&lt;br /&gt;  &lt;span style="font-family:monospace;"&gt;&lt;br /&gt;    ~LockFreeQueue() {&lt;br /&gt;&lt;br /&gt;-       Node* first = head.load(memory_order_relaxed)-&amp;gt;next.load(&lt;br /&gt;&lt;br /&gt;-               memory_order_relaxed);&lt;br /&gt;&lt;br /&gt;-       &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;while&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; (&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#6694e3;"&gt;NULL&lt;/span&gt;&lt;/span&gt; != first) {&lt;br /&gt;&lt;br /&gt;-           &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;if&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; (first == tail.load(memory_order_relaxed)) { &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#aaaaaa;"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#aaaaaa;"&gt;last node in the queue&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#aaaaaa;"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-               &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;delete&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; first;&lt;br /&gt;&lt;br /&gt;-               &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;break&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;-           }&lt;br /&gt;&lt;br /&gt;-           Node* next = first-&amp;gt;next.load(memory_order_relaxed);&lt;br /&gt;&lt;br /&gt;+       Node* first = head.load(memory_order_relaxed);&lt;br /&gt;&lt;br /&gt;+       Node* next = &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#6694e3;"&gt;NULL&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;+        &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;while&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; (&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#6694e3;"&gt;NULL&lt;/span&gt;&lt;/span&gt; != first) {&lt;br /&gt;&lt;br /&gt;+           next = (first-&amp;gt;next).load(memory_order_relaxed);&lt;br /&gt;&lt;br /&gt;            &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;delete&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; first;&lt;br /&gt;&lt;br /&gt;            first = next;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;-&lt;br /&gt;&lt;br /&gt;-       &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;delete&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; head.load(memory_order_relaxed);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Diagram 4 Code snippets for refine&lt;br /&gt;( “-” means the original code lines, “+” means refined code lines.)&lt;br /&gt;As you can see, after refining, the destructor has reduced 5 lines of code, but the logic is the same.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;4.Reduce unnecessary function invocation.&lt;br /&gt;&lt;blockquote&gt;Some times, we can cache the function invocation results by local variables instead of calling the function every time.&lt;br /&gt;For example, each time if we want to use SMR to protect a pointer, we have to call getHPRec(), this function is time consuming and the function return value will be used several times in a big function. If we can have a local variable to cache the value, we can save a lot of time.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;5.Utilize good tools.&lt;br /&gt;&lt;blockquote&gt;As we all know, C++ program is memory error prone, so the usage of memory  in our library is very critical for the correctness. I can still remember segment fault is very usual.&lt;br /&gt;We can use valgrind to check the memory usage. It’s useful, since I fixed a bug in ebstack destructor with this tool.&lt;br /&gt;We also can use oprofile and tprofile to analyze the bottle neck of our program. It’s easy to use VPA (developed by IBM) to get the time consuming code sections in ASM form.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;6.Choose the suitable optimization options.&lt;br /&gt;&lt;blockquote&gt;Before running the performance testing case, it’s necessary to choose the best optimization option of the compiler. Different compilers have different options. I want to mention the XLC on AIX, according to the compile manual, the highest optimization option is -O5, –qinline and -qipa, but when I compile the data structure which contains String, if added the –qipa option, there was segment fault, so I removed this option when compiling data types of String.&lt;/blockquote&gt;&lt;br /&gt;All in all, through nearly two month work, the C++ components’ performance has got big improvement. Not only for the performance, but also fixed some tough bugs. At the same time, the SMR has been extended to support aligned memory management.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-9075913462738081589?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/9075913462738081589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=9075913462738081589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/9075913462738081589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/9075913462738081589'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/06/performance-improvement-in-amino-c.html' title='Performance Improvement in Amino C++ Library'/><author><name>Nick.Zhang</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_gKoHkNBphe0/S-vSTBWI-MI/AAAAAAAAAEk/fwpFtWBn1_A/S220/IMG_1022.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_gKoHkNBphe0/Si4QFK4GcnI/AAAAAAAAACk/PJR_3t01fIY/s72-c/Diagram2.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-5470192979214951600</id><published>2009-05-06T23:08:00.000-07:00</published><updated>2009-05-06T23:31:54.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='ANN'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>ANN: Concurrent Building Blocks: 0.5.3 released!</title><content type='html'>The Amino team is pleased to announce a new release of Concurrent&lt;br /&gt;Building Blocks (Apache License v2).&lt;br /&gt;(1) News in this release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Added PPC version of C++ components. Now C++ components support three platforms(&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;X86_32/Linux/GCC&lt;/span&gt;, &lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;X86_64/Linux/GCC, &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;PPC32/AIX/XLC&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Fixed several tough bugs &lt;/li&gt;&lt;li&gt;Dramatically improved performance of C++ components &lt;/li&gt;&lt;li&gt;Extended SMR for managing aligned memory&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(2)The primary goal is to develop concurrent Java/C++ libraries that&lt;br /&gt;can be used by programmers. Components are grouped into four&lt;br /&gt;categories:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Data Structures &lt;/li&gt;&lt;li&gt;Parallel Patterns &lt;/li&gt;&lt;li&gt;Parallel functions &lt;/li&gt;&lt;li&gt;Atomics and STM &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(3) Links&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download and learn more from &lt;a href="http://amino-cbbs.sourceforge.net/"&gt;http://amino-cbbs.sourceforge.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Discussion: &lt;a href="https://groups.google.com/group/aminoprj"&gt;https://groups.google.com/group/aminoprj&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Project Blog: &lt;a href="http://aminoprj.blogspot.com/"&gt;http://aminoprj.blogspot.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SourceForge: &lt;a href="https://sourceforge.net/projects/amino-cbbs/"&gt;https://sourceforge.net/projects/amino-cbbs/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;ssue Tracker: &lt;a href="https://sourceforge.net/tracker2/?group_id=209259"&gt;https://sourceforge.net/tracker2/?group_id=209259&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And always, your feedbacks are welcome!&lt;br /&gt;&lt;br /&gt;Amino Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-5470192979214951600?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/5470192979214951600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=5470192979214951600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/5470192979214951600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/5470192979214951600'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/05/ann-concurrent-building-blocks-053.html' title='ANN: Concurrent Building Blocks: 0.5.3 released!'/><author><name>Nick.Zhang</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_gKoHkNBphe0/S-vSTBWI-MI/AAAAAAAAAEk/fwpFtWBn1_A/S220/IMG_1022.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-4438540604258428295</id><published>2009-05-06T00:31:00.000-07:00</published><updated>2009-05-06T02:51:52.399-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel error'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><title type='text'>MTRAT helps opensource projects find concurrent errors</title><content type='html'>Developing, testing, and debugging multithreaded programs are still very difficult; it is all too easy to create concurrent programs that appear to work, but fail when it matters most: in production, under heavy load. The most common parallel errors are data race and deadlock. These errors are typically harmful and hard to locate. Multi-Thread Run-time Analysis Tool(&lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;MTRAT&lt;/a&gt;) is a tool that detects and analyzes potential data race and deadlock conditions that might occur in multithreaded Java programs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mina.apache.org/ftpserver/"&gt;Apache FtpServer&lt;/a&gt; is a popular open source Java FTP server. In order to handle multiple requests at the same time, threading and concurrency are introduced in FtpServer core and its dependent library &lt;a href="http://mina.apache.org/"&gt;MINA&lt;/a&gt;, a network application framework. Let's exploit MTRAT on FtpServer to see what happens and apply MTRAT in FtpServer is easy(my operating system is Linux, so this showcase is done under Linux).&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;&lt;LI&gt;Download MTRAT from its webiste &lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;http://www.alphaworks.ibm.com/tech/mtrat&lt;/a&gt;, and configure it following the user manual. Suppose mtrat is extracted under ~/MTRAT.&lt;br /&gt;&lt;LI&gt;The FtpServer startup script file ftpd.sh locates under bin folder, open ftpd.sh and find &lt;font color="#0080ff"&gt;"$JAVACMD" -classpath "$FTPD_CLASSPATH" $MAIN_CLASS $@&lt;/font&gt; in last few lines, this command is for invoking FtpServer application. Comment this line with heading "#" and add one statement to replace "$JAVACMD" with "mtrat" like this,&lt;br /&gt;&lt;font color="#ff0000"&gt;~/MTRAT/mtrat/mtrat&lt;/font&gt; &lt;font color="#00ff00"&gt;-x java.*:sun.*:javax.*:com.*:org.eclipse.*&lt;br /&gt;:org.apache.xerces.*:org.apache.lucene.* -Dcom.ibm.mtrat.dbg.cl=false -Dcom.ibm.mtrat.novolatile=true -Dcom.ibm.mtrat.threadcache=true -Dcom.ibm.mtrat.osm=true&lt;/font&gt; -classpath "$FTPD_CLASSPATH" $MAIN_CLASS $@&lt;br /&gt;&lt;font color="#0080ff"&gt;#"$JAVACMD" -classpath "$FTPD_CLASSPATH" $MAIN_CLASS $@&lt;/font&gt;&lt;br /&gt;&lt;LI&gt;Save ftpd.sh and run it.&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;br /&gt;After Ftpserver launches with MTRAT, we open two new consoles and login as admin and anonymous respectively, then admin uploads a file to ftpserver while anonymous download a file from ftpserver. You will see data races are reported in Ftpserver console.&lt;br /&gt;&lt;br /&gt;We submit two data race bugs found by MTRAT, one is in FtpServer(&lt;a href="https://issues.apache.org/jira/browse/FTPSERVER-122"&gt;[#FTPSERVER-122]Data races are found in FtpStatisticsImpl&lt;/a&gt;) while the other is in MINA(&lt;a href="https://issues.apache.org/jira/browse/DIRMINA-651;jsessionid=AEDFCEB22637952884B39B10CD6C24B5?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel"&gt;[#DIRMINA-651]Data Race in org.apache.mina.core.session.AbstractIoSession&lt;/a&gt;), and attach the data race report generated by MTRAT.&lt;br /&gt;&lt;br /&gt;Positive feedback is received from the Apache community, these two data race bugs are confirmed by the community leader and [#DIRMINA-651] is committed to be fixed in MINA 2.0.0-RC1 while [#FTPSERVER-122] will be fixed after component refactor.&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;&lt;LI&gt;&lt;b&gt;"Thanks a lot for the analysis! The reason why I did not fix the race conditions already is that I'm planning to bring FtpServers statistics handling more in line with MINA. &lt;br /&gt;Anyways, I would much appreciate further analysis on the source code, especially after the statistics implementation is updated."&lt;/b&gt;  &lt;br /&gt;-- Niklas Gustavsson&lt;br /&gt;&lt;LI&gt;&lt;b&gt;"Some of these races are in the idle time checking, which is a core functionality in MINA of course. Those we have to fix."&lt;/b&gt;  &lt;br /&gt;-- Niklas Gustavsson&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;br /&gt;In addition to data race bugs found in FtpServer, &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=45608"&gt;Bug 45608&lt;/a&gt; in Tomcat is confirmed by community too. MTRAT is proven to be practical for real-world application and useful for parallel program developers.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Multi-threaded Runtime Analysis Tool Link&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;http://www.alphaworks.ibm.com/tech/mtrat&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-4438540604258428295?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/4438540604258428295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=4438540604258428295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/4438540604258428295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/4438540604258428295'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/05/mtrat-helps-opensource-projects-find.html' title='MTRAT helps opensource projects find concurrent errors'/><author><name>Daniel</name><uri>http://www.blogger.com/profile/05900572901770565834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_H5FgRHHkL_M/SXGK4lFeqiI/AAAAAAAAAFw/VbBYeArD3yQ/S220/%E4%B8%AA%E4%BA%BA%E7%85%A7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-6832845347963258298</id><published>2009-03-03T18:28:00.000-08:00</published><updated>2009-03-03T19:22:46.108-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ANN'/><title type='text'>ANN: Multi-Thread Run-time Analysis Tool for Java: V2.2 released!</title><content type='html'>The Amino team is pleased to announce a new release of Multi-Thread Run-time Analysis Tool for Java (MTRAT)&lt;br /&gt;&lt;br /&gt;(1) News in this release:&lt;br /&gt;&lt;br /&gt;- More stable by fixing existing bugs&lt;br /&gt;- Supports Linux/X86_64 and AIX/PPC64 platforms, now MTRAT support platforms as below&lt;br /&gt;&lt;br /&gt;&lt;table width="700"&gt;&lt;tbody&gt;&lt;tr bgcolor="green"&gt;&lt;td&gt;Operating System&lt;/td&gt;&lt;td&gt;Hardware Platform&lt;/td&gt;&lt;td&gt;JDK Version&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Windows XP&lt;/td&gt;&lt;td&gt;i386&lt;/td&gt;&lt;td&gt;JDK 6 32-bit version&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GNU/Linux&lt;/td&gt;&lt;td&gt;i386&lt;/td&gt;&lt;td&gt;JDK 6 32-bit version&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GNU/Linux&lt;/td&gt;&lt;td&gt;x86_64&lt;/td&gt;&lt;td&gt;JDK 6 x64 version&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AIX&lt;/td&gt;&lt;td&gt;PPC64&lt;/td&gt;&lt;td&gt;JDK 6 32-bit version&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;(2) Multi-Thread Run-time Analysis Tool is a tool that detects and analyzes potential data race and deadlock conditions that might occur in multi-threaded Java programs.&lt;br /&gt;&lt;br /&gt;(3) Links&lt;br /&gt;- Home: &lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;http://www.alphaworks.ibm.com/tech/mtrat&lt;/a&gt;&lt;br /&gt;- Forum:&lt;a href="http://www.alphaworks.ibm.com/tech/mtrat/forum"&gt;http://www.alphaworks.ibm.com/tech/mtrat/forum&lt;/a&gt;&lt;br /&gt;- Project Blog:&lt;a href="http://aminoprj.blogspot.com"&gt;http://aminoprj.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Your feedbacks are welcome!&lt;br /&gt;Amino Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-6832845347963258298?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/6832845347963258298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=6832845347963258298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/6832845347963258298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/6832845347963258298'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/03/ann-multi-thread-run-time-analysis-tool.html' title='ANN: Multi-Thread Run-time Analysis Tool for Java: V2.2 released!'/><author><name>Daniel</name><uri>http://www.blogger.com/profile/05900572901770565834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_H5FgRHHkL_M/SXGK4lFeqiI/AAAAAAAAAFw/VbBYeArD3yQ/S220/%E4%B8%AA%E4%BA%BA%E7%85%A7.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-3807301714603856700</id><published>2009-02-17T20:15:00.000-08:00</published><updated>2009-02-25T01:47:31.430-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel error'/><title type='text'>Say goodbye to awful concurrency bugs  -- Showcase of MTRAT on Tomcat</title><content type='html'>&lt;p&gt;Multicore hardware trend drives more and more program archtects and progreammers take the double-edged sward -- parallel program, even it has been very notorious for its non-determined bugs, such race condition and deadlock, however mostly their injuries were beaten black and blue by this double-edged sward.  What should and could we do?  &lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;MTRAT&lt;/a&gt; might be one of the live-saving straw.&lt;/p&gt;&lt;p&gt;Today, I will show how do we use MTRAT to find concurrency defects in Tomcat, and hope this tool and article could comfort ones heart if he/she has been hurt by concurrency bugs a lot.&lt;/p&gt;&lt;p&gt;In one word, MTRAT instrument java classes when they are loaded by JVM, and runtime analysis engine is running during the program's execution.  Once it finds some potential problems, it will report them with sufficient information, such as thread backtrace, class name, object id, etc.&lt;/p&gt;&lt;p&gt;Now, let us start the journey of MTRAT on Tomcat (my operating system is Linux, so this showcase is done under Linux),&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download MTRAT from its webiste http://www.alphaworks.ibm.com/tech/mtrat, and configure it following the user manual.&lt;/li&gt;&lt;li&gt;Start tomcat.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;em&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[qiyao@mtrat-test:~/SourceCode/apache-tomcat-6.0.16]$ ./bin/startup.sh&lt;/span&gt;&lt;/em&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;check java process of tomcat, record the process information of tomcat java process.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;em&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;[qiyao@mtrat-test:~/So&lt;span style="color: rgb(51, 102, 255);"&gt;urceCode/ap&lt;/span&gt;ache-tomcat-6.0.16]$  ps -elf | grep tomcat&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);"&gt;0 S qiyao     7415     1  4  81   0 - 143807 stext 11:13 pts/1    00:00:10 /opt/ibm-java-i386-60/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/home/qiyao/SourceCode/apache-tomcat-6.0.16/conf/logging.properties -Djava.endorsed.dirs=/home/qiyao/SourceCode/apache-tomcat-6.0.16/endorsed -classpath :/home/qiyao/SourceCode/apache-tomcat-6.0.16/bin/bootstrap.jar -Dcatalina.base=/home/qiyao/SourceCode/apache-tomcat-6.0.16 -Dcatalina.home=/home/qiyao/SourceCode/apache-tomcat-6.0.16 -Djava.io.tmpdir=/home/qiyao/SourceCode/apache-tomcat-6.0.16/temp org.apache.catalina.startup.Bootstrap start&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;stop tomcat,&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);"&gt;[qiyao@mtrat-test:~/SourceCode/apache-tomcat-6.0.16]$ ./bin/shutdown.sh&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Replace java with mtrat in process command line, and run it,&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;~/MTRAT/mtrat/mtrat&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;-x java.*:com.*:sun.*:org.apache.xerces.*:javax.managment.*&lt;/span&gt;  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/home/qiyao/SourceCode/apache-tomcat-6.0.16/conf/logging.properties -Djava.endorsed.dirs=/home/qiyao/SourceCode/apache-tomcat-6.0.16/endorsed -classpath :/home/qiyao/SourceCode/apache-tomcat-6.0.16/bin/bootstrap.jar -Dcatalina.base=/home/qiyao/SourceCode/apache-tomcat-6.0.16 -Dcatalina.home=/home/qiyao/SourceCode/apache-tomcat-6.0.16 -Djava.io.tmpdir=/home/qiyao/SourceCode/apache-tomcat-6.0.16/temp org.apache.catalina.startup.Bootstrap start&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Access tomcat via browser and click examples shipped in tomcat, then you will see some data races are report in console,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;Actually, user could deploy some applications to tomcat, and drive http requests to tomcat.  Then, MTRAT could find more potential race conditions.  In our experiments, we find some potential race conditions in tomcat 6.0.16, and one of them has been confirmed by tomcat commnity.  See &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=45608"&gt;bug 45608&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-3807301714603856700?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/3807301714603856700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=3807301714603856700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/3807301714603856700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/3807301714603856700'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/02/say-goodbye-to-awful-concurrency-bugs.html' title='Say goodbye to awful concurrency bugs  -- Showcase of MTRAT on Tomcat'/><author><name>Yao Qi</name><uri>http://www.blogger.com/profile/17304401300323253405</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_QnrL2ss4ZYY/S_tZZyBNKFI/AAAAAAAAABQ/_hBv2rRl2gU/S220/qiyao.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-92380041818991933</id><published>2009-02-17T00:50:00.000-08:00</published><updated>2009-02-17T00:51:14.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ANN'/><title type='text'>ANN: Concurrent Building Blocks: 0.3.2 released!</title><content type='html'>The Amino team is pleased to announce a new release of Concurrent&lt;br /&gt;Building Blocks (Apache License v2).&lt;br /&gt;&lt;p&gt;(1) News in this release:  &lt;br /&gt;    - Fix existing bugs  &lt;br /&gt;    - Improved performance of C++ components  &lt;br /&gt;    - A new bounded queue in Java&lt;br /&gt;    - Better makefile scripts&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(2)The primary goal is to develop concurrent Java/C++ libraries that&lt;br /&gt;can be used by programmers.  Components are grouped into four&lt;br /&gt;categories:  &lt;br /&gt;    - Data Structures &lt;br /&gt;    - Parallel Patterns &lt;br /&gt;    - Parallel functions &lt;br /&gt;    - Atomics and STM &lt;br /&gt;  &lt;br /&gt; (3) Links&lt;br /&gt;    - Download and learn more from &lt;a target="_blank" rel="nofollow" href="http://amino-cbbs.sourceforge.net/"&gt;http://amino-cbbs.sourceforge.net/&lt;/a&gt;&lt;br /&gt;    - Discussion: &lt;a target="_blank" rel="nofollow" href="https://groups.google.com/group/aminoprj"&gt;https://groups.google.com/group/aminoprj&lt;/a&gt;&lt;br /&gt;    - Project Blog: &lt;a target="_blank" rel="nofollow" href="http://aminoprj.blogspot.com/"&gt;http://aminoprj.blogspot.com/&lt;/a&gt;&lt;br /&gt;    - SourceForge:   &lt;a target="_blank" rel="nofollow" href="https://sourceforge.net/projects/amino-cbbs/"&gt;https://sourceforge.net/projects/amino-cbbs/&lt;/a&gt;&lt;br /&gt;    - Issue Tracker: &lt;a target="_blank" rel="nofollow" href="https://sourceforge.net/tracker2/?group_id=209259"&gt;https://sourceforge.net/tracker2/?group_id=209259&lt;/a&gt;&lt;br /&gt;Your feedbacks are welcome!&lt;br /&gt;&lt;/p&gt;Amino Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-92380041818991933?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/92380041818991933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=92380041818991933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/92380041818991933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/92380041818991933'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/02/ann-concurrent-building-blocks-032.html' title='ANN: Concurrent Building Blocks: 0.3.2 released!'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-1032208637183287921</id><published>2009-02-10T23:32:00.000-08:00</published><updated>2009-02-10T07:53:04.485-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel error'/><title type='text'>Find parallel errors using MTRAT</title><content type='html'>Multicore architectures have become very popular. To take full advantage of such processor architectures, developers have to introduce parallelism in their software. Developing parallel software is hard and error prone. The most common parallel errors are data race and deadlock. When these errors occur, they are typically hard to locate. The Amino: Multi-threaded Runtime Analysis Tool (MTRAT) for Java can be used by developers to find these hard-to-find bugs.&lt;br /&gt;&lt;br /&gt;Here I give two examples on how MTRAT finds data race and deadlock errors in parallel programs.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Data race occurs when two threads access the same memory location with no ordering constraints enforced between the accesses, where at least one of these accesses is a "write”. The Java sample below has potential data race. Class Value declares an integer field “x”, a synchronization method “add” to get x value and modify its value, a non-synchronization method “get” to return x value. We construct class Task by two Value instance and start two Task thread in main function. Run sample.DataRace with MTRAT, we can check potential data races in program runtime.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_H5FgRHHkL_M/SZGdUpyyqGI/AAAAAAAAAf8/5ks_AioWfvM/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301191214533617762" style="WIDTH: 337px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://4.bp.blogspot.com/_H5FgRHHkL_M/SZGdUpyyqGI/AAAAAAAAAf8/5ks_AioWfvM/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-1.png" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="TEXT-ALIGN: left" align="left"&gt;&lt;span lang="EN-US" style="Georgia: "&gt;MTRAT detection result shows below. One data race is found by MT&lt;span style="font-size:0;"&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;&lt;/span&gt;RAT, and it is reported with class fields, threads which access this field, and stack back trace information. This Read/Write data race happens on field x class sample/Value because two Task threads will visit instance v1 and v2, but add and get method in class Value are not protected by a same lock.&lt;/span&gt; &lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-ALIGN: left" align="left"&gt;&lt;a href="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGd57ArTKI/AAAAAAAAAgE/6hzFTetxUKY/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301191854810418338" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 178px" alt="" src="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGd57ArTKI/AAAAAAAAAgE/6hzFTetxUKY/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-ALIGN: left" align="left"&gt;&lt;span lang="EN-US" style="Georgia: "&gt;Run MTRAT in eclipse:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-ALIGN: left" align="left"&gt;&lt;a href="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGeA0E_oTI/AAAAAAAAAgM/XDmz5f5OfeQ/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-3.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301191973208564018" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 201px" alt="" src="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGeA0E_oTI/AAAAAAAAAgM/XDmz5f5OfeQ/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-3.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A deadlock is a situation in which two or more competing actions are waiting for the other to finish, so that neither ever does. Both situations are destructive and are common when building multi-threaded programs. The Java sample below has potential deadlock. In method harness2 of class Deadlock, two instances of StringBuffer L1 and L2 are created as parameters of class T3 constructor. In method run of class T3, thread will acquire two object locks sequentially, and then release them in opposite order. Since L1 and L2 are passed to t1 and t2 in opposite order, two threads will acquire two locks in opposite order, deadlock occurs. Run sample.Deadlock with MTRAT, we can check potential deadlocks in program runtime.&lt;/p&gt;&lt;p class="MsoNormal" style="TEXT-ALIGN: left" align="left"&gt;&lt;a href="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGfplgcpzI/AAAAAAAAAgU/OH1zczlOhow/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-4.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301193773183444786" style="WIDTH: 242px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://2.bp.blogspot.com/_H5FgRHHkL_M/SZGfplgcpzI/AAAAAAAAAgU/OH1zczlOhow/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-4.png" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Run MTRAT in command line:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_H5FgRHHkL_M/SZGgrh4RxJI/AAAAAAAAAgk/Sb85ZHTmiIQ/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-5.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301194906081019026" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 140px" alt="" src="http://3.bp.blogspot.com/_H5FgRHHkL_M/SZGgrh4RxJI/AAAAAAAAAgk/Sb85ZHTmiIQ/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-5.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Run MTRAT in eclipse:&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_H5FgRHHkL_M/SZGhAON0vOI/AAAAAAAAAgs/b5jy50sXMcs/s1600-h/%E6%9C%AA%E5%91%BD%E5%90%8D-6.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5301195261579934946" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 204px" alt="" src="http://4.bp.blogspot.com/_H5FgRHHkL_M/SZGhAON0vOI/AAAAAAAAAgs/b5jy50sXMcs/s400/%E6%9C%AA%E5%91%BD%E5%90%8D-6.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Multi-threaded Runtime Analysis Tool Link&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.alphaworks.ibm.com/tech/mtrat"&gt;http://www.alphaworks.ibm.com/tech/mtrat&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-1032208637183287921?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/1032208637183287921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=1032208637183287921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1032208637183287921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1032208637183287921'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/01/find-parallel-errors-using-mtrat.html' title='Find parallel errors using MTRAT'/><author><name>Daniel</name><uri>http://www.blogger.com/profile/05900572901770565834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_H5FgRHHkL_M/SXGK4lFeqiI/AAAAAAAAAFw/VbBYeArD3yQ/S220/%E4%B8%AA%E4%BA%BA%E7%85%A7.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H5FgRHHkL_M/SZGdUpyyqGI/AAAAAAAAAf8/5ks_AioWfvM/s72-c/%E6%9C%AA%E5%91%BD%E5%90%8D-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-6328947434480747874</id><published>2009-02-10T21:14:00.000-08:00</published><updated>2009-02-11T21:51:29.884-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Parallel Patterns for C++ Programmer</title><content type='html'>In Amino project, we've created several experimental parallel patterns in C++. There are already advanced parallel patterns for Java programmers, such as Fork/Join from Doug Lea. But things are so ready for C++ world.&lt;br /&gt;&lt;br /&gt;Under the current release of Amino library project, we have created three parallelized version of existing patterns from STL. The method signature is very close to the original one:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Foreach&lt;/li&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255); text-align: center;"&gt;Pattern Usage&lt;/th&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255); text-align: center;"&gt; Computing Kernel&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;vector&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&gt; dataV;&lt;br /&gt;&lt;br /&gt;ThreadPoolExecutor exec;&lt;br /&gt;&lt;br /&gt;for_each(exec, &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;2&lt;/span&gt;&lt;/span&gt;, dataV.begin(), dataV.end(), sum);&lt;br /&gt;exec.shutdown();&lt;br /&gt;exec.waitTermination();&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;sum (&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; n)&lt;br /&gt;{&lt;br /&gt;  result += n;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;li&gt;Transform&lt;/li&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255); text-align: center;"&gt;Pattern Usage&lt;/th&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255); text-align: center;"&gt; Computing Kernel&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-family:monospace;"&gt;    UnaryFunc&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&gt; uf;&lt;br /&gt;vector&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&gt; dataV;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; i = &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;0&lt;/span&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(42, 93, 176);"&gt;&lt;b&gt;&lt;u&gt;for&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; ( ; i&lt;num;&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;1&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ThreadPoolExecutor exec;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(170, 170, 170);"&gt;// change each elemet to its twice &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;transform(exec, &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;2&lt;/span&gt;&lt;/span&gt;, dataV.begin(), dataV.end(), dataV.begin(), uf);&lt;br /&gt;exec.shutdown();&lt;br /&gt;exec.waitTermination();&lt;/num;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;typename&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; ParaType&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; UnaryFunc {&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(42, 93, 176);"&gt;&lt;b&gt;&lt;u&gt;public&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;ParaType &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(119, 153, 187);"&gt;operator&lt;/span&gt;&lt;/span&gt;()(ParaType element) {&lt;br /&gt;      &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(42, 93, 176);"&gt;&lt;b&gt;&lt;u&gt;return&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;2&lt;/span&gt;&lt;/span&gt; * element;&lt;br /&gt;}&lt;br /&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;li&gt;Accumulate&lt;/li&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255); text-align: center;"&gt;Pattern Usage&lt;/th&gt;&lt;th style="color: rgb(255, 255, 0); background-color: rgb(0, 0, 255);"&gt; Computing Kernel&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span style="font-family:monospace;"&gt;vector&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&gt; dataV;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(170, 170, 170);"&gt;// Test the function 1 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; result = accumulate&lt;vector&gt;&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&gt;::iterator, &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;, ThreadPoolExecutor&gt;(exec,&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;        2&lt;/span&gt;&lt;/span&gt;, dataV.begin(), dataV.end());&lt;br /&gt;exec.shutdown();&lt;br /&gt;exec.waitTermination();&lt;/vector&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;template&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;typename&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; ParaType&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 102, 51);"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; UnaryFunc {&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(42, 93, 176);"&gt;&lt;b&gt;&lt;u&gt;public&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;ParaType &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(119, 153, 187);"&gt;operator&lt;/span&gt;&lt;/span&gt;()(ParaType element) {&lt;br /&gt;      &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(42, 93, 176);"&gt;&lt;b&gt;&lt;u&gt;return&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(102, 148, 227);"&gt;2&lt;/span&gt;&lt;/span&gt; * element;&lt;br /&gt;}&lt;br /&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Please note these patterns are in pretty early stage. The performance is still ridiculous now. Please let us know your opinion about the API design. And contributions are always welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-6328947434480747874?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/6328947434480747874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=6328947434480747874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/6328947434480747874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/6328947434480747874'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2009/02/parallel-patterns-for-c-programmer.html' title='Parallel Patterns for C++ Programmer'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-1660921001496027974</id><published>2008-11-27T18:47:00.000-08:00</published><updated>2009-01-03T17:01:18.204-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='parallel'/><title type='text'>Extending JUnit for Testing Parallel Application</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   P { margin-bottom: 0.08in }  --&gt;&lt;/style&gt;    &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   H1 { margin-bottom: 0.04in }   H1.western { font-family: "Arial", sans-serif; font-size: 16pt }   H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }   H1.ctl { font-family: "Arial", sans-serif; font-size: 16pt }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0in;"&gt;As multi-core becomes main stream, it seems inevitable we finally need to do unit tests in parallel. In order to create a parallel test case, developers need to control the mess of multiple threads themselves, which is not interesting and error-prone. Additionally, if exceptions are thrown from child threads, JUnit will silently ignore them.&lt;/p&gt; &lt;h1 class="western"&gt;&lt;/h1&gt; &lt;p style="margin-bottom: 0in;"&gt;Here I gave an example on how our JUnit extension works for a parallel data structure.&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(63, 95, 191);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@RunWith&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(Parallelized.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@ParallelSetting&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(threadNumber&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;1,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;2,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;4,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;TestThreaded&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;Set&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;strSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@Before&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;setUp()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;strSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;LockFreeSet();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@Test&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;doNothing()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@InitFor&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;"testThread"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;putSomeData(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;size){&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;strSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;.add(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;"putSomeData"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@Threaded&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;testThread(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;rank,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;size)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;strSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;.add(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;"abcde"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;rank);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;@CheckFor&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(42, 0, 255);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;"testThread"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;checkResult(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;size)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;i&gt;assertEquals&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(size+1,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 192);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;strSet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;.size());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;static&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;void&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;main(String[]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;args)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;    &lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;i++)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;        &lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;JUnitCore.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;i&gt;runClasses&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;(TestThreaded.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(26, 26, 26);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:Monospace,MS Gothic;"&gt;&lt;span style="font-size:130%;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="margin-bottom: 0in;"&gt;     &lt;style type="text/css"&gt;  &lt;!--   @page { size: 8.5in 11in; margin: 0.79in }   TD P { margin-bottom: 0in }   P { margin-bottom: 0.08in }  --&gt;  &lt;/style&gt;&lt;br /&gt;&lt;br /&gt;The explanation of annotations are listed here:&lt;br /&gt;&lt;table style="width: 615px; height: 661px;" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0"&gt;  &lt;col width="79"&gt;  &lt;col width="136"&gt;  &lt;col width="141"&gt;  &lt;col width="164"&gt;  &lt;tbody&gt;&lt;tr valign="top"&gt;   &lt;td width="79"&gt;    &lt;p align="center"&gt;Name&lt;/p&gt;   &lt;/td&gt;   &lt;td width="136"&gt;    &lt;p align="center"&gt;Annotation Argument&lt;/p&gt;   &lt;/td&gt;   &lt;td width="141"&gt;    &lt;p align="center"&gt;Arguments of annotated method&lt;/p&gt;   &lt;/td&gt;   &lt;td width="164"&gt;    &lt;p align="center"&gt;Comments&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="79"&gt;    &lt;p&gt;@ParallelSetting&lt;/p&gt;   &lt;/td&gt;   &lt;td width="136"&gt;    &lt;p&gt;We can specify number of threads as a named argument    “threadNumber”&lt;/p&gt;   &lt;/td&gt;   &lt;td width="141"&gt;    &lt;p&gt;&lt;br /&gt; &lt;/p&gt;   &lt;/td&gt;   &lt;td width="164"&gt;    &lt;p&gt;This annotation can be used to specify parallel settings for    whole test case.&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="79"&gt;    &lt;p&gt;@InitFor&lt;/p&gt;   &lt;/td&gt;   &lt;td width="136"&gt;    &lt;p&gt;One string argument to specify which method to help&lt;/p&gt;   &lt;/td&gt;   &lt;td width="141"&gt;    &lt;p&gt;Annotated method should have one int type argument to accept    number of threads used by this running.&lt;/p&gt;   &lt;/td&gt;   &lt;td width="164"&gt;    &lt;p&gt;It's used to mark setup method for multi-threaded test. Please note this is different as @Before since it only works for one test.&lt;br /&gt; &lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="79"&gt;    &lt;p&gt;@Threaded&lt;/p&gt;   &lt;/td&gt;   &lt;td width="136"&gt;    &lt;p&gt;No argument&lt;/p&gt;   &lt;/td&gt;   &lt;td width="141"&gt;    &lt;p&gt;Two arguments should be used. One for thread number, and one    for rank of current thread.&lt;/p&gt;   &lt;/td&gt;   &lt;td width="164"&gt;    &lt;p&gt;Methods marked with @Threaded will be executed by multiple    thread.     &lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr valign="top"&gt;   &lt;td width="79"&gt;    &lt;p&gt;@CheckFor&lt;/p&gt;   &lt;/td&gt;   &lt;td width="136"&gt;    &lt;p&gt;One string argument to specify which method to check    correctness&lt;/p&gt;   &lt;/td&gt;   &lt;td width="141"&gt;    &lt;p&gt;Annotated method should have one int type argument to accept    number of threads used by this running.&lt;/p&gt;   &lt;/td&gt;   &lt;td width="164"&gt;    &lt;p&gt;It's used to mark a method, which has duty to check the result of execution of @Threaded test case.&lt;br /&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;&lt;br /&gt;Now we can test our components in parallel without pain:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BswWlutyN3g/SS9dvSt_FLI/AAAAAAAABjA/riTpTqLtV8o/s1600-h/eclipse_green.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 326px; height: 265px;" src="http://2.bp.blogspot.com/_BswWlutyN3g/SS9dvSt_FLI/AAAAAAAABjA/riTpTqLtV8o/s400/eclipse_green.jpg" alt="" id="BLOGGER_PHOTO_ID_5273536755734090930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Reference&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download &lt;a href="http://downloads.sourceforge.net/amino-cbbs/cbbs-junit-ext-0.3.1.zip?modtime=1228836285&amp;amp;big_mirror=0"&gt;Amino JUnit Extension&lt;/a&gt; (Apache License v2) from our &lt;a href="http://sourceforge.net/projects/amino-cbbs"&gt;SourceForge site&lt;/a&gt; and try it. Your feedback is welcome!&lt;/li&gt;&lt;li&gt;Junit version 4.3 and above.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-1660921001496027974?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/1660921001496027974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=1660921001496027974' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1660921001496027974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/1660921001496027974'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2008/11/extending-junit-for-testing-parallel.html' title='Extending JUnit for Testing Parallel Application'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BswWlutyN3g/SS9dvSt_FLI/AAAAAAAABjA/riTpTqLtV8o/s72-c/eclipse_green.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5973770720692284621.post-3769444888349332898</id><published>2008-01-29T00:17:00.000-08:00</published><updated>2008-05-19T17:55:23.440-07:00</updated><title type='text'>Concurrent Building Blocks --- Overview</title><content type='html'>&lt;h2 id="tochome1"&gt;Overall Goals&lt;/h2&gt;&lt;br /&gt;&lt;hr /&gt; The primary goal of the Amino open source software project is to develop concurrent libraries&lt;br /&gt;or building blocks that can be used by programmers. These building blocks share the following&lt;br /&gt;properties:&lt;br /&gt;&lt;br /&gt;1)High-performance and good scalability&lt;br /&gt;&lt;br /&gt;2)Portable across various platforms (hardware/OS)&lt;br /&gt;&lt;br /&gt;3)Consistent programming idioms (with differences in expression of APIs as necessary) across Java,&lt;br /&gt;C/C++ and other popular programming languages.&lt;br /&gt;&lt;br /&gt;4)Exploitation of the latest multicore processors and systems&lt;br /&gt;&lt;br /&gt;5)Tested for performance and correctness at scale&lt;br /&gt;&lt;br /&gt;There is no restriction about the type of concurrent components one can contribute to the project as&lt;br /&gt;long as they are shown to be useful in building real applications. However, we do plan to focus the&lt;br /&gt;project in four specific ways at least at the outset.&lt;br /&gt;&lt;br /&gt;1)Initial focus will be on components which run on shared memory systems.&lt;br /&gt;&lt;br /&gt;2)There is a bias toward working on components which are very broadly usable.&lt;br /&gt;&lt;br /&gt;3)We plan to focus on Java and C/C++.&lt;br /&gt;&lt;br /&gt;4)At the outset, we expect the platform to be x86/Linux.&lt;br /&gt;&lt;br /&gt;&lt;h2 id="tochome2"&gt;Initial Goals&lt;/h2&gt; &lt;hr /&gt;&lt;br /&gt;The initial set of building blocks can be grouped into 4 categories&lt;br /&gt;&lt;br /&gt;1)Data Structures: A set of lockfree collection classes. Since these datastructures were developed&lt;br /&gt;using lockfree algorithms, they enjoy some of the basic lockfree properties like, immunity from different&lt;br /&gt;types of deadlocks, immunity for priority inversion, etc.&lt;br /&gt;&lt;br /&gt;2)Patterns and Scheduling Algorithms: Most application parallelization efforts follow one or more of&lt;br /&gt;a number of well known parallel computation patterns. We provide a set of patterns that developers can&lt;br /&gt;directly leverage to build parallel applications. The patterns we propose to provide will include (but&lt;br /&gt;not limited to): Master-Worker, Map-reduce, Divide and conquer, Pipeline, etc. We also plan to provide&lt;br /&gt;a set of schedulers. The schedulers can be used in conjunction with the patterns classes.&lt;br /&gt;&lt;br /&gt;3)Parallel implementations of general-purpose functions: Example of functions to include, but not limited to:&lt;br /&gt;a)String, Sequence and Array functions: Sort, Search, Merge, Rank, Compare, Reverse, Shuffle, Rotate, Median, etc.&lt;br /&gt;b)Tree and Graph functions: Connected Components, Spanning Trees, Shortest Path, Graph Coloring, etc.&lt;br /&gt;&lt;br /&gt;4) Atomics, STM, etc.&lt;br /&gt;a)Deliver a C++ implementation of atomics. This implementation will be based on the draft of the C++&lt;br /&gt;standards definition of the interface for atomics.&lt;br /&gt;b)Deliver an open, flexible implementation of Software Transactional Memory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5973770720692284621-3769444888349332898?l=aminoprj.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aminoprj.blogspot.com/feeds/3769444888349332898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5973770720692284621&amp;postID=3769444888349332898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/3769444888349332898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5973770720692284621/posts/default/3769444888349332898'/><link rel='alternate' type='text/html' href='http://aminoprj.blogspot.com/2008/01/amino-concurrent-building-blocks.html' title='Concurrent Building Blocks --- Overview'/><author><name>James Gan</name><uri>https://profiles.google.com/112591441221677169312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-R1FfhZgwZ6o/AAAAAAAAAAI/AAAAAAAACOs/KcNFfnWGHyA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
