<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Everything is wrong &#187; Multithreading</title>
	<atom:link href="http://everythingiswrong.free.fr/index.php/tag/multithreading/feed/" rel="self" type="application/rss+xml" />
	<link>http://everythingiswrong.free.fr</link>
	<description>Un blog dédié à l&#039;informatique en général</description>
	<lastBuildDate>Wed, 06 Oct 2021 21:20:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Tests unitaires et multithreading</title>
		<link>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/</link>
		<comments>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 21:19:39 +0000</pubDate>
		<dc:creator>Yan</dc:creator>
				<category><![CDATA[Java J2EE]]></category>
		<category><![CDATA[Tests unitaires]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[Tests]]></category>

		<guid isPermaLink="false">http://yan.langlois.free.fr/wordpress/?p=1224</guid>
		<description><![CDATA[Comment vérifier qu'une méthode ou un programme Java est bien threadsafe.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Comment savoir si une méthode développée fonctionne bien dans un contexte multithread ? Pour répondre à cette question je vous propose cet exemple qui se base sur une classe simple utilisant une instance  statique de <a href="http://download.oracle.com/javase/6/docs/api/index.html?java/text/SimpleDateFormat.html" target="_blank">SimpleDateFormat</a> qui n&#8217;est pas un objet threadsafe. Cette classe possède deux méthodes l&#8217;une n&#8217;est pas threadsafe l&#8217;autre l&#8217;est grâce à un bloc &#8220;synchronisé&#8221;.</p>
<pre class="brush: java; toolbar: true;">public class DateUtil {
 /** Static pour bénéficier d'une instance partagée par l'ensemble des threads.*/
 private static DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

 public static Date parse(String date) throws ParseException {
   Date result = null;
   result = df.parse(date);
   return result;
 }

 public static Date parseThreadSafe(String date) throws ParseException {
   Date result = null;
   // Ce bloc garantit que la méthode fonctionne en multithread.
   synchronized (df) {
     result = df.parse(date);
   }
   return result;
 }
}</pre>
<p style="text-align: justify;">La classe de test utilise la librairie <a href="http://testng.org/" target="_blank">TestNg</a> et non <a href="http://www.junit.org" target="_blank">JUnit</a> car cette dernière ne propose pas de support du multithread. De son coté, TestNg permet de paramétrer une méthode de test avec, entre autre, deux paramètres :</p>
<ul>
<li>invocationCount : le nombre d&#8217;invocation de la méthode (valeur par défaut : 1)</li>
<li>threadPoolSize : la taille du pool de threads qui vont exécuter la méthode (valeur par défaut : 0)</li>
</ul>
<pre class="brush: java; toolbar: true;">public class DateUtilTest {

 @Test(threadPoolSize=20, invocationCount=100)
 public void testParse() {
   try {
     for (int i = 10; i &lt; 20; i++) {
       assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/20" + i),
         DateUtil.parse("01/01/20" + i));    
     }
   } catch (ParseException e) {
     fail("TEST KO : " + e.getMessage());
   }
 }

 @Test(threadPoolSize=20, invocationCount=100)
 public void testParseThreadSafe() {
   try {
     for (int i = 10; i &lt; 20; i++) {
       assertEquals(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/20" + i),
         DateUtil.parseThreadSafe("01/01/20" + i));    
     }
   } catch (ParseException e) {
     fail("TEST KO : " + e.getMessage());
   }
 }

}</pre>
<p style="text-align: justify;">Les boucles <em>for</em> servent à augmenter la probabilité d&#8217;appel simultanés des méthodes testées. Le résultat de l&#8217;exécution est assez simple a analyser car les seules méthodes qui tombent en erreur sont celles qui exécutent la méthode sans le bloc synchronisé.</p>
<p style="text-align: justify;">Vous pouvez retrouver le projet maven à l&#8217;adresse suivante : <a href="https://subversion.assembla.com/svn/everythingiswrong/multithread-tests" target="_blank">https://subversion.assembla.com/svn/everythingiswrong/multithread-tests</a></p>
]]></content:encoded>
			<wfw:commentRss>http://everythingiswrong.free.fr/index.php/2011/04/17/tests-unitaires-et-multithreading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
