< Summary

Information
Class: LeetCode.Concurrency.FizzBuzzMultithreaded.FizzBuzzMultithreadedMonitorLock
Assembly: LeetCode
File(s): D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Concurrency\FizzBuzzMultithreaded\FizzBuzzMultithreadedMonitorLock.cs
Line coverage
100%
Covered lines: 78
Uncovered lines: 0
Coverable lines: 78
Total lines: 124
Line coverage: 100%
Branch coverage
97%
Covered branches: 33
Total branches: 34
Branch coverage: 97%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Fizz(...)90%1010100%
Buzz(...)100%88100%
Fizzbuzz(...)100%88100%
Number(...)100%88100%
IncrementNumber()100%11100%

File(s)

D:\a\LeetCode-CS\LeetCode-CS\source\LeetCode\Concurrency\FizzBuzzMultithreaded\FizzBuzzMultithreadedMonitorLock.cs

#LineLine coverage
 1// --------------------------------------------------------------------------------
 2// Copyright (C) 2025 Eugene Eremeev (also known as Yevhenii Yeriemeieiv).
 3// All Rights Reserved.
 4// --------------------------------------------------------------------------------
 5// This software is the confidential and proprietary information of Eugene Eremeev
 6// (also known as Yevhenii Yeriemeieiv) ("Confidential Information"). You shall not
 7// disclose such Confidential Information and shall use it only in accordance with
 8// the terms of the license agreement you entered into with Eugene Eremeev (also
 9// known as Yevhenii Yeriemeieiv).
 10// --------------------------------------------------------------------------------
 11
 12namespace LeetCode.Concurrency.FizzBuzzMultithreaded;
 13
 14/// <inheritdoc />
 15public class FizzBuzzMultithreadedMonitorLock : IFizzBuzzMultithreaded
 16{
 517    private readonly object _lock = new();
 18    private readonly int _n;
 519    private int _number = 1;
 20
 521    public FizzBuzzMultithreadedMonitorLock(int n)
 522    {
 523        _n = n;
 524    }
 25
 26    public void Fizz(Action printFizz)
 527    {
 528        lock (_lock)
 529        {
 1130            while (_number <= _n)
 1031            {
 1832                while (_number <= _n && (_number % 3 != 0 || _number % 5 == 0))
 1233                {
 1234                    Monitor.Wait(_lock);
 35
 1236                    if (_number > _n)
 437                    {
 438                        return;
 39                    }
 840                }
 41
 642                printFizz.Invoke();
 43
 644                IncrementNumber();
 645            }
 146        }
 547    }
 48
 49    public void Buzz(Action printBuzz)
 550    {
 551        lock (_lock)
 552        {
 853            while (_number <= _n)
 754            {
 1655                while (_number % 3 == 0 || _number % 5 != 0)
 1356                {
 1357                    Monitor.Wait(_lock);
 58
 1359                    if (_number > _n)
 460                    {
 461                        return;
 62                    }
 963                }
 64
 365                printBuzz.Invoke();
 66
 367                IncrementNumber();
 368            }
 169        }
 570    }
 71
 72    public void Fizzbuzz(Action printFizzBuzz)
 573    {
 574        lock (_lock)
 575        {
 676            while (_number <= _n)
 477            {
 1278                while (_number % 3 != 0 || _number % 5 != 0)
 1179                {
 1180                    Monitor.Wait(_lock);
 81
 1182                    if (_number > _n)
 383                    {
 384                        return;
 85                    }
 886                }
 87
 188                printFizzBuzz.Invoke();
 89
 190                IncrementNumber();
 191            }
 292        }
 593    }
 94
 95    public void Number(Action<int> printNumber)
 596    {
 597        lock (_lock)
 598        {
 2199            while (_number <= _n)
 19100            {
 24101                while (_number % 3 == 0 || _number % 5 == 0)
 8102                {
 8103                    Monitor.Wait(_lock);
 104
 8105                    if (_number > _n)
 3106                    {
 3107                        return;
 108                    }
 5109                }
 110
 16111                printNumber.Invoke(_number);
 112
 16113                IncrementNumber();
 16114            }
 2115        }
 5116    }
 117
 118    private void IncrementNumber()
 26119    {
 26120        _number++;
 121
 26122        Monitor.PulseAll(_lock);
 26123    }
 124}