并发编程与高并发解决方案学习(J.U.C之AQS-CountDownLatch、Semaphore)_c高并发解决方案-程序员宅基地

技术标签: Java并发编程  并发编程  



※使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架
※利用int类型表示状态 state=0表示还没有线程获取锁 state=1表示有现成获取锁,大于1表示可重入锁数量
※使用方法是继承 AQS使用模板方法模式,继承模板方法,复写其中的方法
※子类通过继承并通过实现它的方法管理其状态{acquire和release}的方法操作状态
※可以同时实现排它锁和共享锁模式( 独占、共享)

AQS同步组件( CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask

CountDownLatch(作用类似于join()) 同步辅助类,可以实现阻塞的作用,同一时间只能有一个线程操作该计数器,调用该类的await类会一直处于阻塞状态,直到其他线程调用countDown方法,使当前计数器的值为0(计数器不可以重置)
使用场景:程序执行需要等待某个条件完成之后才能继续执行后续的操作,典型应用例如:并行计算( 当某个处理的运算量很大的时候,可以将该运算任务拆分为多个子任务,等待所有子任务都执行完之后,父任务再拿到所有子任务运行结果进行汇总)。
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Slf4j
public class CountDownLatchExample1 {
    private final static int threadCount = 20;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        log.info("finish");
        exec.shutdown();
    }

    private static  void test(int threadNum) throws Exception {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

输出结果

15:54:06.904 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 0
15:54:06.904 [pool-1-thread-8] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 7
15:54:06.905 [pool-1-thread-19] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 18
15:54:06.904 [pool-1-thread-6] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 5
15:54:06.904 [pool-1-thread-7] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 6
15:54:06.904 [pool-1-thread-4] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 3
15:54:06.904 [pool-1-thread-5] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 4
15:54:06.904 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 2
15:54:06.904 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 1
15:54:06.904 [pool-1-thread-9] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 8
15:54:06.905 [pool-1-thread-18] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 17
15:54:06.904 [pool-1-thread-10] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 9
15:54:06.905 [pool-1-thread-17] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 16
15:54:06.904 [pool-1-thread-11] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 10
15:54:06.905 [pool-1-thread-20] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 19
15:54:06.905 [pool-1-thread-16] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 15
15:54:06.905 [pool-1-thread-13] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 12
15:54:06.904 [pool-1-thread-12] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 11
15:54:06.905 [pool-1-thread-15] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 14
15:54:06.905 [pool-1-thread-14] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - 13
15:54:07.009 [main] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample1 - finish

案例2(起了很多线程去完成任务,但是这个任务指向给指定的时间,操作这个时间没做完,也不管了

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Slf4j
public class CountDownLatchExample2 {
    private final static int threadCount = 200;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await(10, TimeUnit.MILLISECONDS);
        log.info("finish");
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        Thread.sleep(1000);
        log.info("{}", threadNum);
    }
}
输出结果
15:57:13.433 [main] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - finish
15:57:14.423 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 0
15:57:14.435 [pool-1-thread-4] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 3
15:57:14.436 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 2
15:57:14.436 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 1
15:57:14.438 [pool-1-thread-5] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 4
15:57:14.441 [pool-1-thread-8] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 7
15:57:14.442 [pool-1-thread-7] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 6
15:57:14.442 [pool-1-thread-6] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 5
15:57:14.442 [pool-1-thread-11] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 10
15:57:14.443 [pool-1-thread-10] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 9
15:57:14.443 [pool-1-thread-9] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 8
15:57:14.443 [pool-1-thread-13] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 12
15:57:14.443 [pool-1-thread-12] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 11
15:57:14.443 [pool-1-thread-15] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 14
15:57:14.444 [pool-1-thread-14] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 13
15:57:14.444 [pool-1-thread-20] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 19
15:57:14.444 [pool-1-thread-19] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 18
15:57:14.447 [pool-1-thread-18] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 17
15:57:14.447 [pool-1-thread-16] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 15
15:57:14.447 [pool-1-thread-17] INFO com.mmall.concurrency.example.aqs.CountDownLatchExample2 - 16
调用shutdown并不是第一时间将线程都全部销毁掉,而是让当前已有的线程全部执行完,之后再把这个线程池销毁掉。
Semaphore 信号量(控制并发访问的线程个数,类似于有限的链表,常用语仅能提供有限个访问的资源,比如 控制数据库连接数)
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

@Slf4j
public class SemaphoreExample1 {
    private final static int threadCount = 20;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    semaphore.acquire(); // 每次获取一个许可
                    test(threadNum);
                    semaphore.release(); // 每次释放一个许可
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        log.info("{}", threadNum);
        Thread.sleep(1000);
    }
}

输出结果(一次3条输出)

15:59:19.291 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 1
15:59:19.291 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 0
15:59:19.291 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 2
15:59:20.309 [pool-1-thread-4] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 3
15:59:20.310 [pool-1-thread-5] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 4
15:59:20.310 [pool-1-thread-6] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 5
15:59:21.310 [pool-1-thread-7] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 6
15:59:21.310 [pool-1-thread-8] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 7
15:59:21.311 [pool-1-thread-9] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 8
15:59:22.310 [pool-1-thread-10] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 9
15:59:22.310 [pool-1-thread-11] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 10
15:59:22.311 [pool-1-thread-12] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 11
15:59:23.311 [pool-1-thread-13] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 12
15:59:23.311 [pool-1-thread-14] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 13
15:59:23.312 [pool-1-thread-15] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 14
15:59:24.311 [pool-1-thread-16] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 15
15:59:24.311 [pool-1-thread-17] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 16
15:59:24.312 [pool-1-thread-18] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 17
15:59:25.312 [pool-1-thread-20] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 19
15:59:25.312 [pool-1-thread-19] INFO com.mmall.concurrency.example.aqs.SemaphoreExample1 - 18

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

@Slf4j
public class SemaphoreExample2 {
    private final static int threadCount = 20;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    semaphore.acquire(3); // 每次获取多个许可
                    test(threadNum);
                    semaphore.release(3); // 每次释放多个许可
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        log.info("{}", threadNum);
        Thread.sleep(1000);
    }
}

输出结果(一次一条输出)

16:00:37.474 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 0
16:00:38.480 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 1
16:00:39.480 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 2
16:00:40.481 [pool-1-thread-4] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 3
16:00:41.482 [pool-1-thread-5] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 4
16:00:42.482 [pool-1-thread-6] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 5
16:00:43.483 [pool-1-thread-7] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 6
16:00:44.483 [pool-1-thread-8] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 7
16:00:45.484 [pool-1-thread-9] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 8
16:00:46.484 [pool-1-thread-10] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 9
16:00:47.484 [pool-1-thread-11] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 10
16:00:48.485 [pool-1-thread-12] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 11
16:00:49.485 [pool-1-thread-13] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 12
16:00:50.485 [pool-1-thread-14] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 13
16:00:51.486 [pool-1-thread-15] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 14
16:00:52.486 [pool-1-thread-17] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 16
16:00:53.486 [pool-1-thread-16] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 15
16:00:54.486 [pool-1-thread-18] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 17
16:00:55.487 [pool-1-thread-19] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 18
16:00:56.488 [pool-1-thread-20] INFO com.mmall.concurrency.example.aqs.SemaphoreExample2 - 19

案例(假如当前并发数是3,超过3个就丢弃)

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

@Slf4j
public class SemaphoreExample3 {
    private final static int threadCount = 20;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    if (semaphore.tryAcquire()) { // 尝试获取一个许可
                        test(threadNum);
                        semaphore.release(); // 释放一个许可
                    }
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        log.info("{}", threadNum);
        Thread.sleep(1000);
    }
}

输出结果

16:01:45.406 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.SemaphoreExample3 - 1
16:01:45.405 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.SemaphoreExample3 - 0
16:01:45.413 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.SemaphoreExample3 - 2
尝试获得许可,只让执行5秒
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

@Slf4j
public class SemaphoreExample4 {
    private final static int threadCount = 20;
    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    if (semaphore.tryAcquire(5000, TimeUnit.MILLISECONDS)) { // 尝试获取一个许可
                        test(threadNum);
                        semaphore.release(); // 释放一个许可
                    }
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        log.info("{}", threadNum);
        Thread.sleep(1000);
    }
}

输出结果(一次三条输出)

16:02:31.454 [pool-1-thread-3] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 2
16:02:31.454 [pool-1-thread-1] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 0
16:02:31.454 [pool-1-thread-2] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 1
16:02:32.463 [pool-1-thread-4] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 3
16:02:32.464 [pool-1-thread-5] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 4
16:02:32.464 [pool-1-thread-6] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 5
16:02:33.464 [pool-1-thread-8] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 7
16:02:33.464 [pool-1-thread-7] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 6
16:02:33.465 [pool-1-thread-9] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 8
16:02:34.465 [pool-1-thread-10] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 9
16:02:34.465 [pool-1-thread-11] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 10
16:02:34.466 [pool-1-thread-12] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 11
16:02:35.465 [pool-1-thread-13] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 12
16:02:35.466 [pool-1-thread-14] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 13
16:02:35.466 [pool-1-thread-15] INFO com.mmall.concurrency.example.aqs.SemaphoreExample4 - 14


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Andy2019/article/details/79784000

智能推荐

android 开发框架_通过此拖放框架学习Android开发-程序员宅基地

文章浏览阅读223次。android 开发框架 1990年代后期,我开始进行涉及计算机的基于教室的研究时,我要做的第一件事就是将一些计算机带入教室。 我的顾问获得了六台第一代Bondi Blue iMac的资助,这些iMac将在我们进行研究的中学安装。 带着那些诱人的胶状形状的机器进入学校后,我对寻找参与者的担忧就烟消云散了。 那时,任何地方的计算机,尤其是中学教室里的计算机,仍然相对不常见,我们能够将其新颖性融..._安卓拖拽框架

android EditText基本设置_android中设置edittext第一行7位第二行8位-程序员宅基地

文章浏览阅读6.8k次。身份证号码大都是数字,但是极少数的最后一位是字母的。比如说,可能是X、Y、Z。在xml里这样设置就可以了:android:digits="1234567890XYZ" 但是我要默认的输入法为数字,怎么实现?谢谢你的解答,解决了我的问题。android:inputType="number"android:digits="0123456789xyzXYZ"同时设_android中设置edittext第一行7位第二行8位

ELAS_ROS算法在KITTI数据集上生成稠密点云-程序员宅基地

文章浏览阅读2.5k次,点赞8次,收藏37次。ELAS是一种基于概率模型的有效立体匹配算法,能够给予双目图像生成深度图,进而转化为点云.该算法的一种改进算法为LS-ELAS,其论文发表在2017年ICRA上,文章题目为"LS-ELAS: Line Segment based Efficient Large Scale Stereo Matching".本片博客主要介绍ELAS算法的一种开源代码ELAS_ROS安装,及其在KITTI数据集上的具体实现.一.KITTI数据集下载与转换为rosbag本文使用的KITTI数据集由kitti2bag转换为._elas_ros

项目众包 开源项目_您的开源项目应该报告其社会效益吗?-程序员宅基地

文章浏览阅读166次。项目众包 开源项目 尽管就“开源”和“自由”软件之间的差异写了很多字,但很少有人指出,对这些差异的讨论通常类似于围绕企业社会角色的辩论,最近几十年来,这种辩论一直占据着主导地位。 企业社会责任(CSR)概念。 但是,事实是,致力于开放原则的组织可以(并且应该)报告其活动,因为这些活动具有经济和社会影响。 对这种情况的分析实际上可能有助于我们调和两个原则性立场,它们之间的共同点比他们可能意识到..._软件免费开放使用 社会效益

seb小铺-程序员宅基地

文章浏览阅读235次。seb小铺链接:http://shop33201394.taobao.com/ ..._华为电脑^seb不能使用

华为鸿蒙HarmonyOS与安卓到底有何不同?_安卓系统臃肿吗_安卓和harmonyos底层-程序员宅基地

文章浏览阅读405次,点赞3次,收藏4次。IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**_安卓和harmonyos底层

随便推点

中软培训PMP国际认证培训_中软国际项目管理序列任职资格管理专业委员会-程序员宅基地

文章浏览阅读1.2k次。一、 培训背景PMP是美国PMI在全球191以上国家和地区推出的项目经理资格认证体系,是目前全球项目管理方面含金量最高的资格认证,是项目管理专业人士身份的象征。我国许多媒体也把PMP称为继MBA,MPA之后的三大金字招牌之一!PMP已得到了全球普遍的高度重视。IT、金融、工程、医疗、物流等诸多行业都在致力于健全其项目管理体系与项目管理人才的培养,很多国内一流企业也都把项目管理能_中软国际项目管理序列任职资格管理专业委员会

Proteus8.7闪退的终极办法,亲测非常有效,并附上完整版教程。_proteus的programdata改动-程序员宅基地

文章浏览阅读7w次,点赞77次,收藏141次。Proteus8.7闪退大部分原因是你pojie的原因。我也被这个深陷其中,我是用替换文件来pojie安装的,打开仿真或者连仿真都不打开直接修改器件都会闪退,简直要命,还不自动保存。文件有这两个,右边的.exe是安装文件,安装过程就不多说了。最后是将patch的文件夹中的的BIN和MODELS替换这个路径的BIN和MODELS,即软件安装路径的BIN和MODELS。替换..._proteus的programdata改动

vue项目element框架 表格el-table 进行拖动排序_vue el-table实现拖拽-程序员宅基地

文章浏览阅读596次。【代码】vue项目element框架 表格el-table 进行拖动排序。_vue el-table实现拖拽

达梦数据库基础2-数据库实例(Linux)_linux达梦数据库创建实例-程序员宅基地

达梦数据库基础2-数据库实例(Linux),介绍了在Linux系统中创建和管理达梦数据库实例的方法,包括使用图形界面工具和命令工具来进行操作。摘要长度:88个字符。

Django1.6与extjs4整合-程序员宅基地

文章浏览阅读189次。从今日开始,公司的新后台系统,我将全部迁移到python的环境下,主要使用了Django与extjs4、jquery1.7的,数据库mysql5.5,容器是nginx。因为不考虑并发因素,所以在这里没有高深的python的线程处理,只是向刚毕业的大学生,几个框架的整合而已,没啥营养,我也是对于python的掌握,觉得Django这框架做的挺好的,模板处理、model层的映射等都比之前玩java..._django extjs

微服务雪崩保护_网络波动会导致微服务都不可用吗-程序员宅基地

文章浏览阅读1.8k次。一.微服务雪崩问题一.分布式系统问题由于网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的。当网络不稳定的时候,作为服务的提供者,自身可能会被拖死,导致服务调用者阻塞,最终可能引发雪崩效应。二.可能产生雪崩的原因:1.服务不可用:缓存击穿、大量的请求、程序bug、硬件故障、资源耗尽等导致服务不可用2.流量过大:由于用户或者代码逻辑重试三.现象:1.开始线程1中微服务D不可用了,线程1阻塞在微服务D2.线程2中,由于微服务C依赖于不可用的微服务D,那么导致微服务C也不可用,线程2阻_网络波动会导致微服务都不可用吗

推荐文章

热门文章

相关标签