介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。

本文详细介绍了Java的四大并发集合类:ConcurrentBag、ConcurrentStack、ConcurrentQueue和ConcurrentDictionary,并通过与线程不安全的集合对比,展示了它们在并发环境下的安全性。此外,通过队列的单例模式案例,解释了如何通过Lock实现线程安全。最后,文章讨论了几类常见的性能调优策略,包括CPU占用、死锁和内存管理等方面。
摘要由CSDN通过智能技术生成

一. 四大并发集合类

背景:我们目前使用的所有集合都是线程不安全的 。

A. ConcurrentBag:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值.

  (等价于同步中的List)

B. ConcurrentStack:线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁.

  (等价于同步中的数组)

C. ConcurrentQueue: 队列的模式,先进先出

  (等价于同步中的队列)

D. ConcurrentDictionary: 字典的模式

  (等价于同步中的字典)

以上四种安全的并发集合类,也可以采用同步版本+Lock锁(或其它锁)来实现

代码实践:

         01-ConcurrentBag
            {
                Console.WriteLine("---------------- 01-ConcurrentBag ---------------------");
                ConcurrentBag<int> bag = new ConcurrentBag<int>();
                bag.Add(1);
                bag.Add(2);
                bag.Add(33);
                //链表的头插法,0代表移除最后一个插入的值
                var result = 0;
                //flag为true,表示移除成功,并且返回被移除的值
                var flag = bag.TryTake(out result);
                Console.WriteLine("移除的值为:{0}", result);

            }
            #endregion

             02-ConcurrentStack
            {
                Console.WriteLine("---------------- 02-ConcurrentStack ---------------------");
                ConcurrentStack<int> stack = new ConcurrentStack<int>();
                stack.Push(1);
                stack.Push(2);
                stack.Push(33);
                //链表的头插法,0代表移除最后一个插入的值
                var result = 0;
                //flag为true,表示移除成功,并且返回被移除的值
                var flag = stack.TryPop(out result);

                Console.WriteLine("移除的值为:{0}", result);
            }
            #endregion

            03-ConcurrentQueue
            {
                Console.WriteLine("---------------- 03-ConcurrentQueue ---------------------");
                ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
                queue.Enqueue(1);
                queue.Enqueue(2);
                queue.Enqueue(33);
                //队列的模式,先进先出,0代表第一个插入的值
                var result = 0;
                //flag为true,表示移除成功,并且返回被移除的值
                var flag = queue.TryDequeue(out result);

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值