0

In the thread When immutable collections are preferable then concurrent it is stated that immutable collections may be slower but they save memory. How is it possible if every change of immutable collection results in creating new object?

I understand that concurrent collection refers to one object and it uses synchronization primitives. So how the immutable collection can save more memory than concurrent collection?

4

1 回答 1

1

不可变集合只有在非常特定的情况下才能节省内存。主要是当您的应用程序的逻辑要求必须经常拍摄集合的快照时。例如,假设您的应用程序的一个工作流必须每隔几秒钟拍摄一次集合的快照并对其进行一些处理,而其他工作流会不断地改变集合。这就是不可变集合大放异彩的场景。对并发集合进行快照在所有方面(CPU/内存/争用)都是昂贵的,而对不可变集合进行快照基本上是免费的。根据定义,不可变集合具有快照语义。将不可变集合转换为快照所需的唯一事情是内存屏障,以便请求快照的线程可以确保它将看到存储在字段或变量中的最新且完全初始化的值。可以通过将字段声明为volatile,或者通过使用Volatile.Read方法读取变量。例子:

var snapshot = Volatile.Read(ref _users);

Interlocked附带说明一下,通过使用技术,也可以在不获取锁的情况下更新不可变集合。甚至还有一个可用的类 ( ImmutableInterlocked) 大大简化了这些操作。例子:

ImmutableInterlocked.Update(ref _users, x => x.Add(user));
于 2021-08-27T17:37:16.390 回答