Class ConnectionManager { Queue<Connection> availableConnection; List <Connection> allotedConnection; ConnectionManager( Integer noOfConnections, ConnectionPoperties props ) { //Create the no of connection objects and assign to avaialbleConnection } Conection getConnection() { syncronized( this.class) { if (availableConnection.isEmpty() ) { throw ConnectionExhausted(); } conn = availableCOnnection.poll(); alottledConectiion.add(conn); } return conn; } synchronized Conection releaseConnection(Connection conn) { alottedconnection.remove(conn); avaialbleConection.add(conn); }
So we have 2 thread, one will be printing odd numbers and others will be printing even number. We have to print them in a synchronized fashion. class Lock { Boolean isOdd; Lock(Boolean odd) { this.isOdd = odd; } synchronized void print(Integer number) { Boolean numberEven = number %2 == 0; while (isOdd == numberEven) { try { wait(); } catch( InterruptedException e) { Thread.currentThread().interrupt(); } } System.out.println(number); isOdd = !isOdd; notify(); } } class PrintThread extends Thread{ Integer limit; Integer value; Lock lock; PrintThread( Integer start,Integer limit, Lock lock) { this.value = start; this.limit = limit; this.lock = lock; } public void run() { while( value < limit ) { lock.print(value); value +=2; } } } public class Test { static public void main(String