• 猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#


    加锁熟悉synchronized和Lock,那么它们有什么区别

    单例模式加锁,我们加关键字synchronized
    分布式锁、redis锁,我们广泛使用lock相关锁
    区别
    synchronized是Java内置关键字,在JVM层面
    Lock是类

    synchronized可以给类、方法、代码块加锁
    而lock只能给代码块加锁

    synchronized不需要手动获取释放锁,使用简单,发生异常自动释放锁,不会造成死锁
    而lock需要,而且没有使用unlock()去会造成死锁

    redis分布式锁+线程池

    @SpringBootTest
    @Slf4j
    public class TestDo {
    
        @Resource
        private RedisUtil redisUtil;
    
        private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
    
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    
    
        @Test
        public void test() {
            List idList = new LinkedList<>();
            for (int i = 0; i < 10; i++) {
                idList.add(Long.valueOf(i));
            }
            for (Long shopId : idList) {
                if (null == shopId) {
                    continue;
                }
                String redisLock = "test:demo:" + shopId;
                String value = redisUtil.get(redisLock, String.class);
                log.info("value:{}", value);
                if (Objects.equals(value, shopId.toString())) {
                    continue;
                }
                redisUtil.set(redisLock, shopId.toString());
                log.info("shopId:{}", shopId);
                scheduledExecutorService.execute(() -> {
                    try {
                        String threadName = Thread.currentThread().getName();
                        long threadId = Thread.currentThread().getId();
                        log.info("线程名称为threadName:{},线程id为threadId:{}",threadName,threadId);
                        String startDate = formatter.format(new Date());
                        //模拟业务
                        try {
                            //5秒
                            log.info("start===");
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            log.error("e:{}", e);
                        }
                        String endDate = formatter.format(new Date());
                    } catch (Exception e) {
                        log.error("threadPool.execute:", e);
                    } finally {
                        //释放锁
                        redisUtil.deleteCache(redisLock);
                    }
    
                });
    
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    在这里插入图片描述

    提个建议,不要在循环圳使用 String拼接,改用StringBuilder的方式

    循环外边new StringBuilder,循环里边.append(),然后使用,尽量不要打印
    看一下一个String类型能吃掉多少内存,这个单位是字节
    提个建议,不要在循环圳使用 String拼接,改用StringBuilder的方式

    栈溢出等情况

    1、栈溢出等情况?
    StackOverFlowError:
    在main中调用main方法,就会不断压栈执行,知道栈溢出;栈的大小可以是固定大小的,也可以动态变化。
    如果动态变化,当栈大小到达整个内存空间不足,就会OutOfMemory异常

  • 相关阅读:
    数字化转型导师坚鹏:基于湖北产业的科技金融创新模式与案例研究
    Spring 对 Junit4,Junit5 的支持上的运用
    一幅长文细学Redis(一)——NoSQL数据库简介以及Redis安装
    sql报错注入和联合注入
    JVM内存模型
    设计模式-享元模式Flyweight(结构型)
    cmake应用:集成gtest进行单元测试
    撤销和重做实现-第二部分(命令模式)
    java计算机毕业设计网上教学管理系统源码+系统+mysql数据库+LW文档+部署文件
    排队(单调队列+二分)
  • 原文地址:https://blog.csdn.net/weixin_43206161/article/details/126809724