package com.interview.basics.java.cocurrency;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 11/4/14
* Time: 1:31 PM
*/
public class LimitedSharingData {
static abstract class IntGenerator{
private volatile boolean cancelled = false;
public abstract int next();
public void cancel() {
this.cancelled = true;
}
public boolean isCancelled(){
return cancelled;
}
}
static class UnsafeIntGenerator extends IntGenerator{
private int base = 0;
@Override
public int next() {
base ++;
Thread.yield();
base ++;
return base;
}
}
static class SynchronizedIntGenerator extends IntGenerator{
int base = 0;
@Override
public synchronized int next() {
while(base > 10000) return -1;
base ++;
Thread.yield();
base ++;
if(base == 652) throw new RuntimeException();
return base;
}
}
static class MutexIntGenerator extends IntGenerator{
private int base = 0;
private Lock lock = new ReentrantLock();
@Override
public int next() {
while(base > 10000) return -1;
lock.lock();
try{
base ++;
Thread.yield();
base ++;
if(base == 652) throw new RuntimeException();
return base;
} finally {
lock.unlock();
}
}
}
static class EverChecker implements Runnable{
private IntGenerator generator;
private final int id;
public EverChecker(int id, IntGenerator generator) {
this.id = id;
this.generator = generator;
}
@Override
public void run() {
while(!generator.isCancelled()){
int val = generator.next();
if((val & 1) == 1){
System.out.println(val + " not even!");
generator.cancel();
}
}
}
}
public static void test(IntGenerator generator, int count){
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < count; i++){
exec.execute(new EverChecker(i, generator));
}
exec.shutdown();
}
public static void main(String[] args){
// IntGenerator unsafe = new UnsafeIntGenerator();
// test(unsafe, 10);
// IntGenerator synchronizedIntGenerator = new SynchronizedIntGenerator();
// test(synchronizedIntGenerator, 10);
IntGenerator mutexIntGenerator = new MutexIntGenerator();
test(mutexIntGenerator, 10);
}
}