• 生产者消费者模式及其存在的问题


     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             //池子
     6             MyConnction[]  connections = new MyConnction[100];
     7 
     8             //创建一个消费者
     9             int index = -1;
    10             for (int i = 0; i < 10; i++)
    11             {
    12                 Thread thread = new Thread(()=> {
    13                     while (true)
    14                     {
    15                         lock (connections)
    16                         {
    17                             if (index >= 0)//池子中有数据
    18                             {
    19                                 connections[index] = null;
    20                                 Console.WriteLine("消费者消费了一个产品!" + index);
    21                                 index--;//消费掉一个产品后,指针移到上一个产品的位置
    22                             } 
    23                         }
    24                         
    25 
    26                         Thread.Sleep(700);
    27                     }
    28                 });
    29 
    30                 thread.IsBackground = true;
    31                 thread.Start();
    32             }
    33 
    34             //创建5个生产者
    35             for (int i = 0; i < 5; i++)
    36             {
    37                 Thread thread = new Thread(() => {
    38                     while (true)
    39                     {
    40                         lock (connections)
    41                         {
    42                             if (index < connections.Length)//池子中有数据
    43                             {
    44                                 connections[index + 1] = new MyConnction();
    45                                 Console.WriteLine("生产者生产了一个产品!" + (index + 1));
    46                                 index++;//消费掉一个产品后,指针移到上一个产品的位置
    47                             }
    48 
    49                         }
    50 
    51                         Thread.Sleep(500);
    52                     }
    53                 });
    54 
    55                 thread.IsBackground = true;
    56                 thread.Start();
    57             }
    58 
    59 
    60             Console.ReadKey();
    61         }
    62     }
    63 
    64     public class MyConnction{}
    View Code

    如果开始没有加锁,可能会导致以下问题:

     原因是多个线程请求同一个资源的时候,假如开始index=2,满足if中的条件的消费者有4个,那么就会消耗四次,事实上,只能消费3次。所以最终index=-1,这样就会出现索引越界的问题。

    解决办法就是加锁。

  • 相关阅读:
    java_监控工具jvisualvm
    bzoj3667: Rabin-Miller算法
    bzoj3677: [Apio2014]连珠线
    4070: [Apio2015]雅加达的摩天楼
    4069: [Apio2015]巴厘岛的雕塑
    4071: [Apio2015]巴邻旁之桥
    bzoj2653: middle
    1500: [NOI2005]维修数列
    bzoj4262: Sum
    bzoj4540: [Hnoi2016]序列
  • 原文地址:https://www.cnblogs.com/wesley168/p/7837883.html
Copyright © 2020-2023  润新知