生命有所坚持而生存可以随遇而安 2021-11-08 11:05 采纳率: 50%
浏览 17
已结题

java并发访问,如何避免重复插入,何谓原子操作,请ds指点。下面有贴出具体代码。

//数据插入实现类(AssetCrudService.java)

public synchronized int add(Asset asset) {
        int r;
        if ((r = this.checkName(asset)) > 1 || (r = this.checkMac(asset)) > 1) {
            return r;
        }
        logger.debug("add");
        List<Asset> temp = new ArrayList<>(assetCache.size());
        temp.addAll(assetCache);//public volatile List<Asset> assetCache = Collections.synchronizedList(new ArrayList<>());
        assetCache.add(asset);
        if (this.assetDao.add(asset)) {
            return 1;
        }
        assetCache = temp;
        return 3001;
    }

//测试类

@Test
    public void test1() throws InterruptedException {
        CountDownLatch start = new CountDownLatch(1);
        CountDownLatch end = new CountDownLatch(50);
        Asset asset = new Asset("1", "77:45:01:3C:BF:12", 1, 12);//待插入的数据
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                try {
                    start.await();
                    int add = assetCrudService.add(asset);
                    logger.debug("线程名称:{}, 返回结果:{}", Thread.currentThread().getName(), add);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    end.countDown();
                }
            }).start();
        }
        start.countDown();
        end.await();
        new Thread(() -> {
            int add = assetCrudService.add(asset);
            logger.debug("线程名称:{}, 返回结果11:{}", Thread.currentThread().getName(), add);
        }).start();
        logger.debug("assetCache:{}", JsonTools.writeValueAsString(this.assetCrudService.assetCache, true));
    }

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 创建了问题 11月8日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来