Sunday, October 23, 2016

Synchronized Threads

So there is a need to synchronize the action of multiple threads and make sure that only one thread can access the resource at a given point in time. This is implemented using a concept called monitors. Each object in Java is associated with a monitor, which a thread can lock or unlock.


Semaphore

A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer. However, no actual permit objects are used; the Semaphore just keeps a count of the number available and acts accordingly.
Producer Consumer using semaphore
Producer ConsumerAp using semaphore

Lock and Condition Threds

Condition factors out the Object monitor methods (wait, notify and notifyAll) into distinct objects to give the effect of having multiple wait-sets per object, by combining them with the use of arbitrary Lock implementations. Where a Lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods.
Stack using Lock and Condition
Stack [using arraylist] using Lock and Condition
Queue Consumer using Lock and Condition
Producer Consumer using Lock and Condition
Producer Consumer using Lock and Condition