Added mutex and semaphore modules to demonstrate locks
Added two modules to demonstrate locks. Mutex demonstrates a simple mutual exclusion lock. Semaphore demonstrates a semaphore for controlling access to a pool of resources. The main class of both programs is App.java.
This commit is contained in:
42
mutex/src/main/java/com/iluwatar/mutex/App.java
Normal file
42
mutex/src/main/java/com/iluwatar/mutex/App.java
Normal file
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* App.
|
||||
*/
|
||||
public class App {
|
||||
|
||||
/**
|
||||
* main method
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Mutex mutex = new Mutex();
|
||||
Jar jar = new Jar(mutex);
|
||||
Thief peter = new Thief("Peter", jar);
|
||||
Thief john = new Thief("John", jar);
|
||||
peter.start();
|
||||
john.start();
|
||||
}
|
||||
|
||||
}
|
58
mutex/src/main/java/com/iluwatar/mutex/Jar.java
Normal file
58
mutex/src/main/java/com/iluwatar/mutex/Jar.java
Normal file
@ -0,0 +1,58 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Jar.
|
||||
*/
|
||||
public class Jar {
|
||||
|
||||
private Lock lock;
|
||||
|
||||
private int beans = 1000;
|
||||
|
||||
public Jar(Lock lock) {
|
||||
this.lock = lock;
|
||||
}
|
||||
|
||||
/**
|
||||
* takeBean method
|
||||
*/
|
||||
public boolean takeBean(Thief thief) {
|
||||
boolean success = false;
|
||||
try {
|
||||
lock.acquire();
|
||||
success = beans > 0;
|
||||
if (success) {
|
||||
beans = beans - 1;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
lock.release();
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
}
|
34
mutex/src/main/java/com/iluwatar/mutex/Lock.java
Normal file
34
mutex/src/main/java/com/iluwatar/mutex/Lock.java
Normal file
@ -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.
|
||||
*/
|
||||
public interface Lock {
|
||||
|
||||
void acquire() throws InterruptedException;
|
||||
|
||||
void release();
|
||||
|
||||
}
|
46
mutex/src/main/java/com/iluwatar/mutex/Mutex.java
Normal file
46
mutex/src/main/java/com/iluwatar/mutex/Mutex.java
Normal file
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public class Mutex implements Lock {
|
||||
private Object owner = null;
|
||||
|
||||
@Override
|
||||
public synchronized void acquire() throws InterruptedException {
|
||||
while (owner != null) {
|
||||
wait();
|
||||
}
|
||||
|
||||
owner = Thread.currentThread();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void release() {
|
||||
owner = null;
|
||||
notify();
|
||||
}
|
||||
|
||||
}
|
51
mutex/src/main/java/com/iluwatar/mutex/Thief.java
Normal file
51
mutex/src/main/java/com/iluwatar/mutex/Thief.java
Normal file
@ -0,0 +1,51 @@
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public class Thief extends Thread {
|
||||
|
||||
private String name;
|
||||
|
||||
private Jar jar;
|
||||
|
||||
public Thief(String name, Jar jar) {
|
||||
this.name = name;
|
||||
this.jar = jar;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
int beans = 0;
|
||||
|
||||
while (jar.takeBean(this)) {
|
||||
beans = beans + 1;
|
||||
System.out.println(name + " took a bean.");
|
||||
}
|
||||
|
||||
System.out.println(name + " took " + beans + " beans.");
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user