72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								layout: pattern
							 | 
						||
| 
								 | 
							
								title: Monitor
							 | 
						||
| 
								 | 
							
								folder: monitor
							 | 
						||
| 
								 | 
							
								permalink: /patterns/monitor/
							 | 
						||
| 
								 | 
							
								categories: Concurrency
							 | 
						||
| 
								 | 
							
								language: en
							 | 
						||
| 
								 | 
							
								tags:
							 | 
						||
| 
								 | 
							
								 - Performance
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Intent
							 | 
						||
| 
								 | 
							
								Monitor pattern is used to create thread-safe objects and prevent conflicts between threads in concurrent applications.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Explanation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In plain words
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> Monitor pattern is used to enforce single-threaded access to data. Only one thread at a time is allowed to execute code within the monitor object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Wikipedia says
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								> In concurrent programming (also known as parallel programming), a monitor is a synchronization construct that allows threads to have both mutual exclusion and the ability to wait (block) for a certain condition to become false. Monitors also have a mechanism for signaling other threads that their condition has been met.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								**Programmatic Examples**
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Consider there is a bank that transfers money from an account to another account with transfer method . it is `synchronized` mean just one thread can access to this method because if many threads access to it and transfer money from an account to another account in same time balance changed !   
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								class Bank {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     private int[] accounts;
							 | 
						||
| 
								 | 
							
								     Logger logger;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								     public Bank(int accountNum, int baseAmount, Logger logger) {
							 | 
						||
| 
								 | 
							
								         this.logger = logger;
							 | 
						||
| 
								 | 
							
								         accounts = new int[accountNum];
							 | 
						||
| 
								 | 
							
								         Arrays.fill(accounts, baseAmount);
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								     public synchronized void transfer(int accountA, int accountB, int amount) {
							 | 
						||
| 
								 | 
							
								         if (accounts[accountA] >= amount) {
							 | 
						||
| 
								 | 
							
								             accounts[accountB] += amount;
							 | 
						||
| 
								 | 
							
								             accounts[accountA] -= amount;
							 | 
						||
| 
								 | 
							
								             logger.info("Transferred from account :" + accountA + " to account :" + accountB + " , amount :" + amount + " . balance :" + getBalance());
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								getBalance always return total amount and the total amount should be same after each transfers 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								     private synchronized int getBalance() {
							 | 
						||
| 
								 | 
							
								         int balance = 0;
							 | 
						||
| 
								 | 
							
								         for (int account : accounts) {
							 | 
						||
| 
								 | 
							
								             balance += account;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         return balance;
							 | 
						||
| 
								 | 
							
								     }
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Class diagram
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Applicability
							 | 
						||
| 
								 | 
							
								Use the Monitor pattern when
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* we have a shared resource and there is critical section .
							 | 
						||
| 
								 | 
							
								* you want to create thread-safe objects .
							 | 
						||
| 
								 | 
							
								* you want to achieve mutual exclusion in high level programming language .
							 |