diff --git a/mutex/README.md b/mutex/README.md
new file mode 100644
index 000000000..24edad7eb
--- /dev/null
+++ b/mutex/README.md
@@ -0,0 +1,30 @@
+---
+layout: pattern
+title: Mutex
+folder: mutex
+permalink: /patterns/mutex/
+categories: Lock
+tags:
+ - Java
+ - Difficulty-Beginner
+---
+
+## 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.
+
+
+
+## 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
new file mode 100644
index 000000000..3b7c966f8
Binary files /dev/null and b/mutex/etc/mutex.png differ
diff --git a/mutex/pom.xml b/mutex/pom.xml
new file mode 100644
index 000000000..c9e0e83b7
--- /dev/null
+++ b/mutex/pom.xml
@@ -0,0 +1,42 @@
+
+
+
+ * 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) {
+ Mutex mutex = new Mutex();
+ Jar jar = new Jar(1000, mutex);
+ Thief peter = new Thief("Peter", jar);
+ Thief 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
new file mode 100644
index 000000000..4fe0a4637
--- /dev/null
+++ b/mutex/src/main/java/com/iluwatar/mutex/Jar.java
@@ -0,0 +1,67 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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() {
+ boolean 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
new file mode 100644
index 000000000..fef67010e
--- /dev/null
+++ b/mutex/src/main/java/com/iluwatar/mutex/Lock.java
@@ -0,0 +1,34 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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
new file mode 100644
index 000000000..8e08534cd
--- /dev/null
+++ b/mutex/src/main/java/com/iluwatar/mutex/Mutex.java
@@ -0,0 +1,67 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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
new file mode 100644
index 000000000..d2225876c
--- /dev/null
+++ b/mutex/src/main/java/com/iluwatar/mutex/Thief.java
@@ -0,0 +1,62 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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;
+
+/**
+ * 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 {
+
+ /**
+ * 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() {
+ int beans = 0;
+
+ while (jar.takeBean()) {
+ beans = beans + 1;
+ System.out.println(name + " took a bean.");
+ }
+
+ System.out.println(name + " took " + beans + " beans.");
+ }
+
+}
diff --git a/mutex/src/test/java/com/iluwatar/mutex/AppTest.java b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java
new file mode 100644
index 000000000..f3a123519
--- /dev/null
+++ b/mutex/src/test/java/com/iluwatar/mutex/AppTest.java
@@ -0,0 +1,34 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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.Test;
+import java.io.IOException;
+
+public class AppTest{
+ @Test
+ public void test() throws IOException {
+ String[] args = {};
+ App.main(args);
+ }
+}
\ No newline at end of file
diff --git a/mutex/src/test/java/com/iluwatar/mutex/JarTest.java b/mutex/src/test/java/com/iluwatar/mutex/JarTest.java
new file mode 100644
index 000000000..97101466a
--- /dev/null
+++ b/mutex/src/test/java/com/iluwatar/mutex/JarTest.java
@@ -0,0 +1,43 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Test case for taking beans from a Jar
+ */
+public class JarTest {
+
+ @Test
+ public void testTakeBeans() {
+ Mutex mutex = new Mutex();
+ Jar jar = new Jar(10, mutex);
+ for (int i = 0; i < 10; i++) {
+ assertTrue(jar.takeBean());
+ }
+ assertFalse(jar.takeBean());
+ }
+
+}
\ No newline at end of file
diff --git a/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java b/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java
new file mode 100644
index 000000000..8b3e82cb4
--- /dev/null
+++ b/mutex/src/test/java/com/iluwatar/mutex/MutexTest.java
@@ -0,0 +1,47 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Test case for acquiring and releasing a Mutex
+ */
+public class MutexTest {
+
+ @Test
+ public void acquireReleaseTest() {
+ Mutex 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 8430bcebe..9d66f5f9b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,19 +1,15 @@
+ * 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) {
+ FruitShop 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
new file mode 100644
index 000000000..0a4713438
--- /dev/null
+++ b/semaphore/src/main/java/com/iluwatar/semaphore/Customer.java
@@ -0,0 +1,76 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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 Customer attempts to repeatedly take Fruit from the FruitShop by
+ * taking Fruit from FruitBowl instances.
+ */
+public class Customer extends Thread {
+
+ /**
+ * 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) {
+ FruitBowl bowl = fruitShop.takeBowl();
+ Fruit fruit;
+
+ if (bowl != null && (fruit = bowl.take()) != null) {
+ System.out.println(name + " took an " + fruit);
+ fruitBowl.put(fruit);
+ fruitShop.returnBowl(bowl);
+ }
+ }
+
+ System.out.println(name + " took " + fruitBowl);
+
+ }
+
+}
diff --git a/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java b/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java
new file mode 100644
index 000000000..0a4224d20
--- /dev/null
+++ b/semaphore/src/main/java/com/iluwatar/semaphore/Fruit.java
@@ -0,0 +1,60 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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 {
+
+ public static enum FruitType {
+ ORANGE, APPLE, LEMON
+ }
+
+ private 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
new file mode 100644
index 000000000..ac2b87ada
--- /dev/null
+++ b/semaphore/src/main/java/com/iluwatar/semaphore/FruitBowl.java
@@ -0,0 +1,88 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 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;
+
+/**
+ * A FruitBowl contains Fruit.
+ */
+public class FruitBowl {
+
+ private ArrayList