4.5.3写时复制容器CopyOnWriteArrayList和CopyOnWriteArraySet理解、优点和使用场景

理解

CopyOnWrite就是写时复制容器。在写入数据的时候,会从源容器复制出一个新容器,然后在新容器中添加元素,添加完成之后,再让源容器指针指向新容器。

写时复制容器的好处

可以对CopyOnWrite并发读取,而不需要加锁,因为当前容器不会添加任何元素。

这是一种读写分离的思想,读和写分别使用不同的容器

写时复制容器的缺点

1、每次修改都会新建一个数组,如果源数组很大,修改操作比较频繁,性能就会很低,内存会有大开销

2、数据一致性问题:因为修改并不会马上就能够被读到,即只能保证最终一致性,不能保证实时一致性。

适用场景:

多读少写的场景,比如白名单黑名单商品类目的访问,因为大多数是读,偶尔修改;

举例:

假如我们有一个商品的搜索网站,搜索的时候有些关键词是需要被屏蔽掉的,这个时候就可以使用CopyOnWrite存放不能搜索的黑名单,如果用户搜索的关键词在黑名单中,就提示不能搜索

使用写时复制容器需要注意的事情:

1、尽量在初始化的时候指定容器大小,避免容器扩容产生的开销

2、写入数据的时候,最好一次性写入,防止多次复制

demo:把数据放在List中,一次性写入写时复制容器

public class Test {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(list);
    }
}

常用方法

写时复制容器常用方法和普通集合差不多

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在EPPLUS 4.5.3中,可以通过以下步骤复制表格: 1. 获取要复制的源表格的范围,例如: ```csharp ExcelRange sourceRange = worksheet.Cells["A1:D4"]; ``` 2. 使用`Copy`方法创建源表格的副本: ```csharp ExcelRange copiedRange = sourceRange.Copy(); ``` 3. 将副本表格的范围设置为目标位置,例如: ```csharp copiedRange.AutoFitColumns(); copiedRange.AutoFitRows(); copiedRange.Style.Border.BorderAround(ExcelBorderStyle.Thin); copiedRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; worksheet.Cells["F1"].LoadFromText("Copied Table:"); worksheet.Cells["F2"].LoadFromText(" "); worksheet.Cells["F3"].LoadFromText(" "); worksheet.Cells["F4"].LoadFromText(" "); worksheet.Cells["F1"].Style.Font.Bold = true; worksheet.Cells["F1:F4"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; copiedRange.CopyTo(worksheet.Cells["G1"]); ``` 在这里,我们将副本表格的样式自适应列和行的宽度和度,将单元格边框设置为细线条,水平居中和垂直居中。然后,我们将副本表格的范围复制到目标位置(这里是单元格“G1”)。 完整的示例代码如下: ```csharp using OfficeOpenXml; using OfficeOpenXml.Style; class Program { static void Main(string[] args) { using (ExcelPackage package = new ExcelPackage()) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1"); // Create source table worksheet.Cells["A1"].Value = "Header1"; worksheet.Cells["B1"].Value = "Header2"; worksheet.Cells["C1"].Value = "Header3"; worksheet.Cells["D1"].Value = "Header4"; worksheet.Cells["A2"].Value = "Data1"; worksheet.Cells["B2"].Value = "Data2"; worksheet.Cells["C2"].Value = "Data3"; worksheet.Cells["D2"].Value = "Data4"; worksheet.Cells["A3"].Value = "Data5"; worksheet.Cells["B3"].Value = "Data6"; worksheet.Cells["C3"].Value = "Data7"; worksheet.Cells["D3"].Value = "Data8"; worksheet.Cells["A4"].Value = "Data9"; worksheet.Cells["B4"].Value = "Data10"; worksheet.Cells["C4"].Value = "Data11"; worksheet.Cells["D4"].Value = "Data12"; // Copy source table ExcelRange sourceRange = worksheet.Cells["A1:D4"]; ExcelRange copiedRange = sourceRange.Copy(); copiedRange.AutoFitColumns(); copiedRange.AutoFitRows(); copiedRange.Style.Border.BorderAround(ExcelBorderStyle.Thin); copiedRange.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // Paste copied table worksheet.Cells["F1"].LoadFromText("Copied Table:"); worksheet.Cells["F2"].LoadFromText(" "); worksheet.Cells["F3"].LoadFromText(" "); worksheet.Cells["F4"].LoadFromText(" "); worksheet.Cells["F1"].Style.Font.Bold = true; worksheet.Cells["F1:F4"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; copiedRange.CopyTo(worksheet.Cells["G1"]); package.SaveAs(new FileInfo("output.xlsx")); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值