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 .
|