diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eaf1da5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+os/code/target/*
diff --git a/os/code/os/pom.xml b/os/code/os/pom.xml
new file mode 100644
index 0000000..6425d7c
--- /dev/null
+++ b/os/code/os/pom.xml
@@ -0,0 +1,81 @@
+
+
+
+ 4.0.0
+
+ com.scaler
+ os
+ pyenv shell 3.9.7
+
+ os
+
+ http://www.example.com
+
+
+ UTF-8
+ 1.9
+ 1.9
+
+
+
+
+ junit
+ junit
+ 4.11
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ provided
+
+
+
+
+
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+
+
+
diff --git a/os/code/os/src/main/java/com/scaler/App.java b/os/code/os/src/main/java/com/scaler/App.java
new file mode 100644
index 0000000..6a73e3c
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/App.java
@@ -0,0 +1,13 @@
+package com.scaler;
+
+/**
+ * Hello world!
+ *
+ */
+public class App
+{
+ public static void main( String[] args )
+ {
+ System.out.println( "Hello World!" );
+ }
+}
diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java
new file mode 100644
index 0000000..d42c8f2
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Adder.java
@@ -0,0 +1,22 @@
+package com.scaler.addersubtractor;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class Adder implements Runnable {
+ private Count count;
+
+ @Override
+ public void run() {
+
+ for (int i = 1; i <= 100; ++i) {
+ count.getValue().getAndAdd(i);
+ try {
+ Thread.sleep(10);
+ } catch (Exception e) {
+ System.out.println("Something wrong happened");
+ }
+ }
+
+ }
+}
diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java
new file mode 100644
index 0000000..348de30
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Count.java
@@ -0,0 +1,15 @@
+package com.scaler.addersubtractor;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Count {
+ private AtomicInteger value = new AtomicInteger(0);
+
+ public AtomicInteger getValue() {
+ return value;
+ }
+
+ public void setValue(AtomicInteger value) {
+ this.value = value;
+ }
+}
diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java
new file mode 100644
index 0000000..795718c
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Runner.java
@@ -0,0 +1,27 @@
+package com.scaler.addersubtractor;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+public class Runner {
+ public static void main(String[] args) {
+ Count count = new Count();
+
+ Adder adder = new Adder(count);
+ Subtractor subtractor = new Subtractor(count);
+
+ ExecutorService executor = Executors.newCachedThreadPool();
+ executor.execute(adder);
+ executor.execute(subtractor);
+
+ executor.shutdown();
+ try {
+ executor.awaitTermination(100, TimeUnit.SECONDS);
+ } catch (Exception e) {
+ System.out.println("Something wrong happened");
+ }
+
+ System.out.println(count.getValue());
+ }
+}
diff --git a/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java b/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java
new file mode 100644
index 0000000..ae80473
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/addersubtractor/Subtractor.java
@@ -0,0 +1,28 @@
+package com.scaler.addersubtractor;
+
+import java.util.concurrent.locks.Lock;
+
+import lombok.AllArgsConstructor;
+
+@AllArgsConstructor
+public class Subtractor implements Runnable {
+ private Count count;
+
+ @Override
+ public void run() {
+
+ for (int i = 1; i <= 100; ++i) {
+ count.getValue().getAndAdd(-i);
+ try {
+ Thread.sleep(10);
+ } catch (Exception e) {
+ System.out.println("Something wrong happened");
+ }
+
+ for (int j = 0; j < 10000; ++j) {
+ // do something
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java
new file mode 100644
index 0000000..8fc0f05
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Consumer.java
@@ -0,0 +1,36 @@
+package com.scaler.producerconsumer;
+
+import java.util.Queue;
+import java.util.concurrent.Semaphore;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public class Consumer implements Runnable {
+
+ private Queue store;
+ private String name;
+ private Semaphore forProducer;
+ private Semaphore forConsumer;
+
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ forConsumer.acquire();
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Error acquiring semaphore " + e);
+ }
+
+ store.remove();
+ System.out.println("Consumed: " + name + " Left units :" + store.size());
+
+ forProducer.release();
+
+ }
+
+ }
+
+}
diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java
new file mode 100644
index 0000000..d2650ec
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Producer.java
@@ -0,0 +1,36 @@
+package com.scaler.producerconsumer;
+
+import java.util.Queue;
+import java.util.concurrent.Semaphore;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public class Producer implements Runnable {
+
+ private Queue store;
+ private int maxSize;
+ private String name;
+ private Semaphore forProducer;
+ private Semaphore forConsumer;
+
+ @Override
+ public void run() {
+ while (true) {
+ try {
+ forProducer.acquire();
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Error acquiring semaphore " + e);
+ }
+
+ store.add(new UnitOfWork());
+ System.out.println("Produced: " + name + " Left units :" + store.size());
+
+ forConsumer.release();
+ }
+
+ }
+
+}
diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java b/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java
new file mode 100644
index 0000000..a9e5a81
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/producerconsumer/Runner.java
@@ -0,0 +1,35 @@
+package com.scaler.producerconsumer;
+
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.Semaphore;
+import java.util.stream.Collectors;
+
+public class Runner {
+
+ private static final Set producerNames = Set.of("p1", "p2", "p3");
+ private static final Set consumerNames = Set.of("c1", "c2", "c3", "c4");
+
+ public static void main(String[] args) {
+ Queue store = new ConcurrentLinkedDeque<>();
+ int maxSize = 20;
+
+ Semaphore forProducer = new Semaphore(maxSize);
+ Semaphore forConsumer = new Semaphore(0);
+
+ Set producers = producerNames
+ .stream()
+ .map(name -> new Producer(store, maxSize, name, forProducer, forConsumer))
+ .collect(Collectors.toSet());
+
+ Set consumers = consumerNames
+ .stream()
+ .map(name -> new Consumer(store, name, forProducer, forConsumer))
+ .collect(Collectors.toSet());
+
+ producers.forEach(producer -> new Thread(producer).start());
+ consumers.forEach(consumer -> new Thread(consumer).start());
+
+ }
+}
diff --git a/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java b/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java
new file mode 100644
index 0000000..484e681
--- /dev/null
+++ b/os/code/os/src/main/java/com/scaler/producerconsumer/UnitOfWork.java
@@ -0,0 +1,5 @@
+package com.scaler.producerconsumer;
+
+public class UnitOfWork {
+
+}
diff --git a/os/code/os/src/test/java/com/scaler/AppTest.java b/os/code/os/src/test/java/com/scaler/AppTest.java
new file mode 100644
index 0000000..7ec3246
--- /dev/null
+++ b/os/code/os/src/test/java/com/scaler/AppTest.java
@@ -0,0 +1,20 @@
+package com.scaler;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+{
+ /**
+ * Rigorous Test :-)
+ */
+ @Test
+ public void shouldAnswerWithTrue()
+ {
+ assertTrue( true );
+ }
+}
diff --git a/os/code/os/target/classes/com/scaler/App.class b/os/code/os/target/classes/com/scaler/App.class
new file mode 100644
index 0000000..6737821
Binary files /dev/null and b/os/code/os/target/classes/com/scaler/App.class differ
diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class b/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class
new file mode 100644
index 0000000..e35dd5b
Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Consumer.class differ
diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class b/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class
new file mode 100644
index 0000000..c554525
Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Producer.class differ
diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class b/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class
new file mode 100644
index 0000000..7df08f9
Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/Runner.class differ
diff --git a/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class b/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class
new file mode 100644
index 0000000..7ef319d
Binary files /dev/null and b/os/code/os/target/classes/com/scaler/producerconsumer/UnitOfWork.class differ
diff --git a/os/code/os/target/test-classes/com/scaler/AppTest.class b/os/code/os/target/test-classes/com/scaler/AppTest.class
new file mode 100644
index 0000000..20815e5
Binary files /dev/null and b/os/code/os/target/test-classes/com/scaler/AppTest.class differ