From b9da15dda36bb3a14e8f0eadbb4a5154814bbf15 Mon Sep 17 00:00:00 2001 From: Rohit Singh Date: Wed, 27 Jan 2021 01:49:36 +0530 Subject: [PATCH] issue 1628 handled, removed mutex and semaphore from catalog. (#1634) * issue 1628 handled, removed mutex and semaphore from catalog. * issue1634, modules still exiting in pom.xml Co-authored-by: Subhrodip Mohanta --- mutex/README.md | 31 ----- mutex/etc/mutex.png | Bin 12737 -> 0 bytes mutex/etc/mutex.urm.puml | 27 ---- mutex/pom.xml | 61 --------- .../src/main/java/com/iluwatar/mutex/App.java | 49 ------- .../src/main/java/com/iluwatar/mutex/Jar.java | 67 ---------- .../main/java/com/iluwatar/mutex/Lock.java | 35 ----- .../main/java/com/iluwatar/mutex/Mutex.java | 67 ---------- .../main/java/com/iluwatar/mutex/Thief.java | 67 ---------- .../test/java/com/iluwatar/mutex/AppTest.java | 39 ------ .../test/java/com/iluwatar/mutex/JarTest.java | 45 ------- .../java/com/iluwatar/mutex/MutexTest.java | 51 -------- pom.xml | 2 - semaphore/README.md | 33 ----- semaphore/etc/semaphore.png | Bin 30089 -> 0 bytes semaphore/etc/semaphore.urm.puml | 56 -------- semaphore/pom.xml | 61 --------- .../main/java/com/iluwatar/semaphore/App.java | 50 -------- .../java/com/iluwatar/semaphore/Customer.java | 82 ------------ .../java/com/iluwatar/semaphore/Fruit.java | 64 ---------- .../com/iluwatar/semaphore/FruitBowl.java | 92 -------------- .../com/iluwatar/semaphore/FruitShop.java | 120 ------------------ .../java/com/iluwatar/semaphore/Lock.java | 35 ----- .../com/iluwatar/semaphore/Semaphore.java | 77 ----------- .../java/com/iluwatar/semaphore/AppTest.java | 39 ------ .../com/iluwatar/semaphore/FruitBowlTest.java | 55 -------- .../com/iluwatar/semaphore/SemaphoreTest.java | 59 --------- 27 files changed, 1364 deletions(-) delete mode 100644 mutex/README.md delete mode 100644 mutex/etc/mutex.png delete mode 100644 mutex/etc/mutex.urm.puml delete mode 100644 mutex/pom.xml delete mode 100644 mutex/src/main/java/com/iluwatar/mutex/App.java delete mode 100644 mutex/src/main/java/com/iluwatar/mutex/Jar.java delete mode 100644 mutex/src/main/java/com/iluwatar/mutex/Lock.java delete mode 100644 mutex/src/main/java/com/iluwatar/mutex/Mutex.java delete mode 100644 mutex/src/main/java/com/iluwatar/mutex/Thief.java delete mode 100644 mutex/src/test/java/com/iluwatar/mutex/AppTest.java delete mode 100644 mutex/src/test/java/com/iluwatar/mutex/JarTest.java delete mode 100644 mutex/src/test/java/com/iluwatar/mutex/MutexTest.java delete mode 100644 semaphore/README.md delete mode 100644 semaphore/etc/semaphore.png delete mode 100644 semaphore/etc/semaphore.urm.puml delete mode 100644 semaphore/pom.xml delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/App.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/Customer.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/Lock.java delete mode 100644 semaphore/src/main/java/com/iluwatar/semaphore/Semaphore.java delete mode 100644 semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java delete mode 100644 semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java delete mode 100644 semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java diff --git a/mutex/README.md b/mutex/README.md deleted file mode 100644 index 997c37a35..000000000 --- a/mutex/README.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: pattern -title: Mutex -folder: mutex -permalink: /patterns/mutex/ -categories: Concurrency -tags: - - Decoupling ---- - -## Also known as - -* Mutual Exclusion Lock -* Binary Semaphore - -## Intent -Create a lock which only allows a single thread to access a resource at any one instant. - -## Class diagram -![alt text](./etc/mutex.png "Mutex") - -## Applicability -Use a Mutex when - -* You need to prevent two threads accessing a critical section at the same time -* Concurrent access to a resource could lead to a race condition - -## Credits - -* [Lock (computer science)](http://en.wikipedia.org/wiki/Lock_(computer_science)) -* [Semaphores](http://tutorials.jenkov.com/java-concurrency/semaphores.html) diff --git a/mutex/etc/mutex.png b/mutex/etc/mutex.png deleted file mode 100644 index 3b7c966f87dffab72c65a77c2578c801086f7d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12737 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 VGkgbka zZrPv`F2s!(XN(5;9?luGnbU6ZRPDxb%}xkDH5Q@R3^2O!F6ko!yI}?zw>i7KYS}z4 z^ous{Zy-C1Yn9&PU9_{pfmy)JCCE(}(lP(TiSwHrHy<=#fZ^VTr#}PBwBp^fO^_z~ z!uOJkHJ5&>`~z%#Vy>EOC6Ns-;oEYkcV73I-!D^$@@pIYgr;?v35(8A0TJ9`E{PP7mZzGzfsC^MWJS_kalM@x{}N{ZGKg z_;b6aGsY>q8f7Sl{$mCLxpkJEH!yMU;A7&#Cm0iJ8ORyk@1w3c2(*S`Q#u`kOKfoK zUn$53R`m`71^3V_2LHnR;xaWXD2w&&mbY;Du2ti67+2R?nGZtoW0 z1ms(^KUb-UH`cy2`!FJ|oeUB|j^Ocbdm$hG7CvZ9u36~M=Roz)hRnv>icaz2nY9r4 zQe=ND>jLh6p8RQi7poE+d`nubMg47KcGv`C1kTuQC^prl{RsYtKE>U&pS3xpD2bye zz`8IBa2prL%-lCwPMUzK;(L_52c0DkH6Djw@g&=pksn3WESvX*sKu{SbQD5k7Y@%q2d<`?CN7pKyz=c&y&^u%wMD(zE(G>;< z=Uat>YLi{DN}lQ10+R(9rh-i7g0Rib&13Sp`&q8Ja;$hTzZaS}Y~!r4Mcfy=F&b9X zJNFuEh4SJ_fN!1kAdCe}CR@1g0MRTvHa_+lIfU>s)BBX)HPtE{qztE96x#nPDz%x; z7>LZinU=)_A#{4b$p|wNo;q6{6UAi>c&Fn8kP<&yiaA-)VMoECYD{IVXjLR~K-4U| z8zmAS9_-|y@I`sCJ`m#&fk8er1XEZ{5#N$j4fL|-c5H2@cRn3-GWxyY;hCINKAdT5n3Q7O+SWoQjg z6k}QwHW>f6KiPAL3MiY=<3YGjEvQc`s}&O<=)2Ch38U$MKSvE^;lhM)PW(4bjE+tkbj(&p$olfA!OJ@T-)H`)z;rrwye%g9Yri0GA_kFc#bFv+ zm_pzy+|eV$4)r5eHlkr4#G&1xZqk}HJURnxnFT&ksZ2C|Z5mdMt2>)p+rF0bm%q+g zH+DGq`_DTGmB{hR6IaYN_tG*kj{Lz zJYg9u`QS1hwKscws!W81J{=p>;#GwiNo+U?ChmlSCS*}+x<%lQHOeD-sOSDSv!Z?L z;=vQLF+%KZjJ;LYjUidViV%wc0O+sEZRHYYovG0rsouR4f!^5$ z;Z00kmZ9HveTAzYquu*iygG}BO#1?#XJs0i8iPvf0(VGWdB&%$GwPs8ubR-pqTXN3R!kEF`BN<(+lthHv$AK*6sJcAhYZ zT%L4oo&sf6HnAL5KiYFpqf)9eQSOVA2P7pJb{m#cBrA7!C3Es|3KT3-V71FeINS6W z)orWIi%$`kK9QK=(&gTM^FoYYWP#!k1l7L@af=m7xCOIko_kEr40}p{A2L8AgU=+y z#u}90tBz|J!~EfdUca4J0@~!Kc>gwV_#5y<;Kq(Qh5I3n2bA!{v>5>dL__@q{EnNt z`#U}3#V#QR013zigMij$za(&068a03XNVyu1mV=Ec|EglDvo_0n{=w2=O`x&!(9~# z<#>GHJApDwGKd-i08jw|2W$nhG-RAWL=--JcfLsr<4A4DmkE4{CE{IjsV|fQCjzS- zt{Fupf~>JfP-X7#lMoBDi|)RqE0uJdz+T7g*Kh--H^JzCxE4+v;U&aA5%#p}we^f* z`#|yQHY#KnHWWVtlt4Uj^xF|rzUMx(X@6y+sEcHAk|qeoP0^UC5XK?N!MHt}!T>&j*QC1`)o~j;XTVrl62HmQyfh7%aSS=?S*Y3zk#|g3$!Nt=9*B= zT0T#|GdY|NE!G(_Ca#&oj*1GaDupbMA$%51$#Ee7-1(+V)WpH9w}2|rWmjB!+~E1X zwE8&lzJL?GSAD1#FO98Q@uSo~7fyK%+yqK1QPlyE+GMQd_@E`VMu+O!Z#w_gaX{H( zTMQ`&w4XATE~VHkdUx#S!Hk6`|iz`uL_DO&)a z!VT_EX+m(8{3FKiS3$$dL}!1c|ATB-E4O_9>rr;yz28j;De8*LN6f&0>PHYL+8h<> z&f-h7d7;3}4d@sAM%>&F3duya{lv7HWnPM0bc(&buo_Ov+0;U<`P;|=*2K5=I2=t^ zE%rPC8c>|EJ#7rYpmI?L@!Omf`n5m&8SCXNktHo)-UQx?H2||0PZ>y`LfI}AsxzS` z(yt9pZAk^Db_pAUJ?G*KQ_GNfU;u~4hbs4KFiUKOk_JUg#?RR{2Ju>NmDAt{rK1Re z;Rls!VZ3-TM9=0`_x&gw`}YymXkUo{V5@;M_U6or+ZvdgVwg#yE|nMh7&VoB?*>5Q z5LI~oB+ziwMlD742GKs<{J;JsBb3BbI+TKeMk5RSCjuG`#y>4w;6uk1HWnxGm`W>& RF7OUbSwT&{Qq~OqKL9K>lx6?` diff --git a/mutex/etc/mutex.urm.puml b/mutex/etc/mutex.urm.puml deleted file mode 100644 index 08cf43b90..000000000 --- a/mutex/etc/mutex.urm.puml +++ /dev/null @@ -1,27 +0,0 @@ -@startuml -package com.iluwatar.mutex { - class App { - + App() - + main(args : String[]) {static} - } - class Jar { - - beans : int - - lock : Lock - + Jar(beans : int, lock : Lock) - + takeBean() : boolean - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Mutex { - - owner : Object - + Mutex() - + acquire() - + getOwner() : Object - + release() - } -} -Jar --> "-lock" Lock -Mutex ..|> Lock -@enduml \ No newline at end of file diff --git a/mutex/pom.xml b/mutex/pom.xml deleted file mode 100644 index 84455abb1..000000000 --- a/mutex/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.24.0-SNAPSHOT - - mutex - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.mutex.App - - - - - - - - - diff --git a/mutex/src/main/java/com/iluwatar/mutex/App.java b/mutex/src/main/java/com/iluwatar/mutex/App.java deleted file mode 100644 index c50acc65a..000000000 --- a/mutex/src/main/java/com/iluwatar/mutex/App.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -/** - * A Mutex prevents multiple threads from accessing a resource simultaneously. - * - *

In this example we have two thieves who are taking beans from a jar. Only one thief can take - * a bean at a time. This is ensured by a Mutex lock which must be acquired in order to access the - * jar. Each thief attempts to acquire the lock, take a bean and then release the lock. If the lock - * has already been acquired, the thief will be prevented from continuing (blocked) until the lock - * has been released. The thieves stop taking beans once there are no beans left to take. - */ -public class App { - - /** - * main method. - */ - public static void main(String[] args) { - var mutex = new Mutex(); - var jar = new Jar(1000, mutex); - var peter = new Thief("Peter", jar); - var john = new Thief("John", jar); - peter.start(); - john.start(); - } - -} diff --git a/mutex/src/main/java/com/iluwatar/mutex/Jar.java b/mutex/src/main/java/com/iluwatar/mutex/Jar.java deleted file mode 100644 index 4a0861e1a..000000000 --- a/mutex/src/main/java/com/iluwatar/mutex/Jar.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -/** - * A Jar has a resource of beans which can only be accessed by a single Thief (thread) at any one - * time. A Mutex lock is used to prevent more than one Thief taking a bean simultaneously. - */ -public class Jar { - - /** - * The lock which must be acquired to access the beans resource. - */ - private final Lock lock; - - /** - * The resource within the jar. - */ - private int beans; - - public Jar(int beans, Lock lock) { - this.beans = beans; - this.lock = lock; - } - - /** - * Method for a thief to take a bean. - */ - public boolean takeBean() { - var success = false; - try { - lock.acquire(); - success = beans > 0; - if (success) { - beans = beans - 1; - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - lock.release(); - } - - return success; - } - -} diff --git a/mutex/src/main/java/com/iluwatar/mutex/Lock.java b/mutex/src/main/java/com/iluwatar/mutex/Lock.java deleted file mode 100644 index bd28c3c08..000000000 --- a/mutex/src/main/java/com/iluwatar/mutex/Lock.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -/** - * Lock is an interface for a lock which can be acquired and released. - */ -public interface Lock { - - void acquire() throws InterruptedException; - - void release(); - -} diff --git a/mutex/src/main/java/com/iluwatar/mutex/Mutex.java b/mutex/src/main/java/com/iluwatar/mutex/Mutex.java deleted file mode 100644 index 6c62cc8ea..000000000 --- a/mutex/src/main/java/com/iluwatar/mutex/Mutex.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -/** - * Mutex is an implementation of a mutual exclusion lock. - */ -public class Mutex implements Lock { - - /** - * The current owner of the lock. - */ - private Object owner; - - /** - * Returns the current owner of the Mutex, or null if available. - */ - public Object getOwner() { - return owner; - } - - /** - * Method called by a thread to acquire the lock. If the lock has already been acquired this will - * wait until the lock has been released to re-attempt the acquire. - */ - @Override - public synchronized void acquire() throws InterruptedException { - while (owner != null) { - wait(); - } - - owner = Thread.currentThread(); - } - - /** - * Method called by a thread to release the lock. - */ - @Override - public synchronized void release() { - if (Thread.currentThread() == owner) { - owner = null; - notify(); - } - } - -} diff --git a/mutex/src/main/java/com/iluwatar/mutex/Thief.java b/mutex/src/main/java/com/iluwatar/mutex/Thief.java deleted file mode 100644 index a9a715970..000000000 --- a/mutex/src/main/java/com/iluwatar/mutex/Thief.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Thief is a class which continually tries to acquire a jar and take a bean from it. When the jar - * is empty the thief stops. - */ -public class Thief extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(Thief.class); - - /** - * The name of the thief. - */ - private final String name; - - /** - * The jar. - */ - private final Jar jar; - - public Thief(String name, Jar jar) { - this.name = name; - this.jar = jar; - } - - /** - * In the run method the thief repeatedly tries to take a bean until none are left. - */ - @Override - public void run() { - var beans = 0; - - while (jar.takeBean()) { - beans = beans + 1; - LOGGER.info("{} took a bean.", name); - } - - LOGGER.info("{} took {} beans.", name, beans); - } - -} diff --git a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java deleted file mode 100644 index 7866b22a8..000000000 --- a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Application Test Entrypoint - */ -class AppTest { - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/mutex/src/test/java/com/iluwatar/mutex/JarTest.java b/mutex/src/test/java/com/iluwatar/mutex/JarTest.java deleted file mode 100644 index 786f96e44..000000000 --- a/mutex/src/test/java/com/iluwatar/mutex/JarTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -import static org.junit.jupiter.api.Assertions.assertFalse; - -import java.util.stream.IntStream; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * Test case for taking beans from a Jar - */ -public class JarTest { - - @Test - public void testTakeBeans() { - var mutex = new Mutex(); - var jar = new Jar(10, mutex); - IntStream.range(0, 10).mapToObj(i -> jar.takeBean()).forEach(Assertions::assertTrue); - assertFalse(jar.takeBean()); - } - -} diff --git a/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java b/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java deleted file mode 100644 index d6d0cc1d7..000000000 --- a/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.mutex; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.Test; - -/** - * Test case for acquiring and releasing a Mutex - */ -public class MutexTest { - - @Test - public void acquireReleaseTest() { - var mutex = new Mutex(); - assertNull(mutex.getOwner()); - try { - mutex.acquire(); - assertEquals(mutex.getOwner(), Thread.currentThread()); - } catch (InterruptedException e) { - fail(e.toString()); - } - mutex.release(); - assertNull(mutex.getOwner()); - } - -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index eee0cb154..a3fb757a3 100644 --- a/pom.xml +++ b/pom.xml @@ -141,8 +141,6 @@ module monad mute-idiom - mutex - semaphore hexagonal abstract-document aggregator-microservices diff --git a/semaphore/README.md b/semaphore/README.md deleted file mode 100644 index be882e04a..000000000 --- a/semaphore/README.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: pattern -title: Semaphore -folder: semaphore -permalink: /patterns/semaphore/ -categories: Concurrency -tags: - - Performance ---- - -## Also known as -Counting Semaphore - -## Intent -Create a lock which mediates access to a pool of resources. -Only a limited number of threads, specified at the creation -of the semaphore, can access the resources at any given time. -A semaphore which only allows one concurrent access to a resource -is called a binary semaphore. - -## Class diagram -![alt text](./etc/semaphore.png "Semaphore") - -## Applicability -Use a Semaphore when - -* You have a pool of resources to allocate to different threads -* Concurrent access to a resource could lead to a race condition - -## Credits - -* [Semaphore(programming)] (http://en.wikipedia.org/wiki/Semaphore_(programming)) -* [Semaphores] (http://tutorials.jenkov.com/java-concurrency/semaphores.html) diff --git a/semaphore/etc/semaphore.png b/semaphore/etc/semaphore.png deleted file mode 100644 index a2ff6d0c4f5bb931d724a4dd3872e7dde4730102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30089 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 diff --git a/semaphore/etc/semaphore.urm.puml b/semaphore/etc/semaphore.urm.puml deleted file mode 100644 index 168fd17e7..000000000 --- a/semaphore/etc/semaphore.urm.puml +++ /dev/null @@ -1,56 +0,0 @@ -@startuml -package com.iluwatar.semaphore { - class App { - + App() - + main(args : String[]) {static} - } - class Fruit { - - type : FruitType - + Fruit(type : FruitType) - + getType() : FruitType - + toString() : String - } - enum FruitType { - + APPLE {static} - + LEMON {static} - + ORANGE {static} - + valueOf(name : String) : FruitType {static} - + values() : FruitType[] {static} - } - class FruitBowl { - - fruit : List - + FruitBowl() - + countFruit() : int - + put(f : Fruit) - + take() : Fruit - + toString() : String - } - class FruitShop { - - available : boolean[] - - bowls : FruitBowl[] - - semaphore : Semaphore - + FruitShop() - + countFruit() : int - + returnBowl(bowl : FruitBowl) - + takeBowl() : FruitBowl - } - interface Lock { - + acquire() {abstract} - + release() {abstract} - } - class Semaphore { - - counter : int - - licenses : int - + Semaphore(licenses : int) - + acquire() - + getAvailableLicenses() : int - + getNumLicenses() : int - + release() - } -} -FruitType ..+ Fruit -Fruit --> "-type" FruitType -FruitShop --> "-semaphore" Semaphore -FruitBowl --> "-fruit" Fruit -Semaphore ..|> Lock -@enduml \ No newline at end of file diff --git a/semaphore/pom.xml b/semaphore/pom.xml deleted file mode 100644 index 64fd44db6..000000000 --- a/semaphore/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.24.0-SNAPSHOT - - semaphore - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.semaphore.App - - - - - - - - - diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/App.java b/semaphore/src/main/java/com/iluwatar/semaphore/App.java deleted file mode 100644 index ebb35037f..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/App.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -/** - * A Semaphore mediates access by a group of threads to a pool of resources. - * - *

In this example a group of customers are taking fruit from a fruit shop. There is a bowl each - * of apples, oranges and lemons. Only one customer can access a bowl simultaneously. A Semaphore is - * used to indicate how many resources are currently available and must be acquired in order for a - * bowl to be given to a customer. Customers continually try to take fruit until there is no fruit - * left in the shop. - */ -public class App { - - /** - * main method. - */ - public static void main(String[] args) { - var shop = new FruitShop(); - new Customer("Peter", shop).start(); - new Customer("Paul", shop).start(); - new Customer("Mary", shop).start(); - new Customer("John", shop).start(); - new Customer("Ringo", shop).start(); - new Customer("George", shop).start(); - } - -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java b/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java deleted file mode 100644 index 47f503a06..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A Customer attempts to repeatedly take Fruit from the FruitShop by taking Fruit from FruitBowl - * instances. - */ -public class Customer extends Thread { - - private static final Logger LOGGER = LoggerFactory.getLogger(Customer.class); - - /** - * Name of the Customer. - */ - private final String name; - - /** - * The FruitShop he is using. - */ - private final FruitShop fruitShop; - - /** - * Their bowl of Fruit. - */ - private final FruitBowl fruitBowl; - - /** - * Customer constructor. - */ - public Customer(String name, FruitShop fruitShop) { - this.name = name; - this.fruitShop = fruitShop; - this.fruitBowl = new FruitBowl(); - } - - /** - * The Customer repeatedly takes Fruit from the FruitShop until no Fruit remains. - */ - public void run() { - - while (fruitShop.countFruit() > 0) { - var bowl = fruitShop.takeBowl(); - if (bowl != null) { - var fruit = bowl.take(); - if (fruit != null) { - LOGGER.info("{} took an {}", name, fruit); - fruitBowl.put(fruit); - fruitShop.returnBowl(bowl); - } - } - } - - LOGGER.info("{} took {}", name, fruitBowl); - - } - -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java b/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java deleted file mode 100644 index 1f4026b92..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -/** - * Fruit is a resource stored in a FruitBowl. - */ -public class Fruit { - - /** - * Enumeration of Fruit Types. - */ - public enum FruitType { - ORANGE, APPLE, LEMON - } - - private final FruitType type; - - public Fruit(FruitType type) { - this.type = type; - } - - public FruitType getType() { - return type; - } - - /** - * toString method. - */ - public String toString() { - switch (type) { - case ORANGE: - return "Orange"; - case APPLE: - return "Apple"; - case LEMON: - return "Lemon"; - default: - return ""; - } - } - -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java b/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java deleted file mode 100644 index 5c2901efe..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -import java.util.ArrayList; -import java.util.List; - -/** - * A FruitBowl contains Fruit. - */ -public class FruitBowl { - - private final List fruit = new ArrayList<>(); - - /** - * Returns the amount of fruits left in bowl. - * - * @return The amount of Fruit left in the bowl. - */ - public int countFruit() { - return fruit.size(); - } - - /** - * Put an item of Fruit into the bowl. - * - * @param f fruit - */ - public void put(Fruit f) { - fruit.add(f); - } - - /** - * Take an item of Fruit out of the bowl. - * - * @return The Fruit taken out of the bowl, or null if empty. - */ - public Fruit take() { - if (fruit.isEmpty()) { - return null; - } else { - return fruit.remove(0); - } - } - - /** - * toString method. - */ - public String toString() { - var apples = 0; - var oranges = 0; - var lemons = 0; - - for (var f : fruit) { - switch (f.getType()) { - case APPLE: - apples++; - break; - case ORANGE: - oranges++; - break; - case LEMON: - lemons++; - break; - default: - } - } - - return apples + " Apples, " + oranges + " Oranges, and " + lemons + " Lemons"; - } -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java b/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java deleted file mode 100644 index c74145610..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/FruitShop.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -/** - * A FruitShop contains three FruitBowl instances and controls access to them. - */ -public class FruitShop { - - /** - * The FruitBowl instances stored in the class. - */ - private final FruitBowl[] bowls = { - new FruitBowl(), - new FruitBowl(), - new FruitBowl() - }; - - /** - * Access flags for each of the FruitBowl instances. - */ - private final boolean[] available = { - true, - true, - true - }; - - /** - * The Semaphore that controls access to the class resources. - */ - private final Semaphore semaphore; - - /** - * FruitShop constructor. - */ - public FruitShop() { - for (var i = 0; i < 100; i++) { - bowls[0].put(new Fruit(Fruit.FruitType.APPLE)); - bowls[1].put(new Fruit(Fruit.FruitType.ORANGE)); - bowls[2].put(new Fruit(Fruit.FruitType.LEMON)); - } - - semaphore = new Semaphore(3); - } - - /** - * Returns the amount of fruits left in shop. - * - * @return The amount of Fruit left in the shop. - */ - public synchronized int countFruit() { - return bowls[0].countFruit() + bowls[1].countFruit() + bowls[2].countFruit(); - } - - /** - * Method called by Customer to get a FruitBowl from the shop. This method will try to acquire the - * Semaphore before returning the first available FruitBowl. - */ - public synchronized FruitBowl takeBowl() { - - FruitBowl bowl = null; - - try { - semaphore.acquire(); - - if (available[0]) { - bowl = bowls[0]; - available[0] = false; - } else if (available[1]) { - bowl = bowls[1]; - available[1] = false; - } else if (available[2]) { - bowl = bowls[2]; - available[2] = false; - } - - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - semaphore.release(); - } - return bowl; - } - - /** - * Method called by a Customer instance to return a FruitBowl to the shop. This method releases - * the Semaphore, making the FruitBowl available to another Customer. - */ - public synchronized void returnBowl(FruitBowl bowl) { - if (bowl == bowls[0]) { - available[0] = true; - } else if (bowl == bowls[1]) { - available[1] = true; - } else if (bowl == bowls[2]) { - available[2] = true; - } - } - -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Lock.java b/semaphore/src/main/java/com/iluwatar/semaphore/Lock.java deleted file mode 100644 index 5679e2a05..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/Lock.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -/** - * Lock is an interface for a lock which can be acquired and released. - */ -public interface Lock { - - void acquire() throws InterruptedException; - - void release(); - -} diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Semaphore.java b/semaphore/src/main/java/com/iluwatar/semaphore/Semaphore.java deleted file mode 100644 index 48b008fdd..000000000 --- a/semaphore/src/main/java/com/iluwatar/semaphore/Semaphore.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -/** - * Semaphore is an implementation of a semaphore lock. - */ -public class Semaphore implements Lock { - - private final int licenses; - /** - * The number of concurrent resource accesses which are allowed. - */ - private int counter; - - public Semaphore(int licenses) { - this.licenses = licenses; - this.counter = licenses; - } - - /** - * Returns the number of licenses managed by the Semaphore. - */ - public int getNumLicenses() { - return licenses; - } - - /** - * Returns the number of available licenses. - */ - public int getAvailableLicenses() { - return counter; - } - - /** - * Method called by a thread to acquire the lock. If there are no resources available this will - * wait until the lock has been released to re-attempt the acquire. - */ - public synchronized void acquire() throws InterruptedException { - while (counter == 0) { - wait(); - } - counter = counter - 1; - } - - /** - * Method called by a thread to release the lock. - */ - public synchronized void release() { - if (counter < licenses) { - counter = counter + 1; - notify(); - } - } - -} diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java deleted file mode 100644 index 302796238..000000000 --- a/semaphore/src/test/java/com/iluwatar/semaphore/AppTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Application Test Entrypoint - */ -class AppTest { - - @Test - void shouldExecuteWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java deleted file mode 100644 index bc21f9196..000000000 --- a/semaphore/src/test/java/com/iluwatar/semaphore/FruitBowlTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import org.junit.jupiter.api.Test; - -/** - * Test taking from and putting Fruit into a FruitBowl - */ -public class FruitBowlTest { - - @Test - public void fruitBowlTest() { - var fbowl = new FruitBowl(); - - assertEquals(0, fbowl.countFruit()); - - for (var i = 1; i <= 10; i++) { - fbowl.put(new Fruit(Fruit.FruitType.LEMON)); - assertEquals(i, fbowl.countFruit()); - } - - for (var i = 9; i >= 0; i--) { - assertNotNull(fbowl.take()); - assertEquals(i, fbowl.countFruit()); - } - - assertNull(fbowl.take()); - } -} diff --git a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java b/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java deleted file mode 100644 index 6d64066fb..000000000 --- a/semaphore/src/test/java/com/iluwatar/semaphore/SemaphoreTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * The MIT License - * Copyright © 2014-2019 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.iluwatar.semaphore; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.Test; - -/** - * Test case for acquiring and releasing a Semaphore - */ -public class SemaphoreTest { - - @Test - public void acquireReleaseTest() { - var sphore = new Semaphore(3); - - assertEquals(3, sphore.getAvailableLicenses()); - - for (var i = 2; i >= 0; i--) { - try { - sphore.acquire(); - assertEquals(i, sphore.getAvailableLicenses()); - } catch (InterruptedException e) { - fail(e.toString()); - } - } - - for (var i = 1; i <= 3; i++) { - sphore.release(); - assertEquals(i, sphore.getAvailableLicenses()); - } - - sphore.release(); - assertEquals(3, sphore.getAvailableLicenses()); - } -}