Ryan's Blog

有三个线程t1,t2,t3如何保证顺序执行?

✅有三个线程T1,T2,T3如何保证顺序执行? 典型回答 想要让三个线程依次执行,并且严格按照T1,T2,T3的顺序的话,主要就是想办法让三个线程之间可以通信、或者可以排队。 想让多个线程之间可以通信,可以通过join方法实现,还可以通过CountDownLatch、CyclicBarrier和Semaphore来实现通信。 想要让线程之间排队的话,可以通过线程池或者Comple...

并发编程中的原子性和数据库acid的原子性一样吗?

并发编程中的原子性和数据库ACID的原子性一样吗? 典型回答 不一样。原子性在并发编程中,和在数据库中两种不同的概念。 在数据库中,事务的ACID中原子性指的是”要么都执行要么都回滚”。 在并发编程中,原子性指的是”操作不可拆分、不被中断”。所以在并发编程中,我们要保证原子性指的就是一段代码需要不可拆分,不被中断。 比如经典的i++问题,就是原子性的一个很好地体现。 如Redis...

如何让java的线程池顺序执行任务?

如何让Java的线程池顺序执行任务? 典型回答 Java中的线程池本身并不提供内置的方式来保证任务的顺序执行的,因为线程池的设计目的是为了提高并发性能和效率,如果顺序执行的话,那就和单线程没区别了。 但是如果被问到想要实现这个功能该怎么做,有以下两种方式。 1、使用单线程线程池 我们可以使用SingleThreadExecutor这种线程池来执行任务,因为这个线程池中只有一个线程,...

如何实现主线程捕获子线程异常

如何实现主线程捕获子线程异常 典型回答 为什么不能在try-catch中捕获子线程的异常? 我们说过,没办法直接在主线程的try-catch中捕获子线程的异常。但是,有的时候子线程中会开启一些IO链接,网络资源等,那么,如何在抛出异常的时候进行处理呢? 有几个方案可以实现: 使用Future 如果想要在主线程能够捕获子线程的异常,可以考虑使用Callable和Future,它们允...

到底啥是内存屏障?到底怎么加的?

到底啥是内存屏障?到底怎么加的? 典型回答 (无关紧要的话:这个问题也困扰了我好久,之前一直没深究,毕竟这东西离开发太远了,但是最近在volatile的介绍中有很多人问这个东西到底是咋加的,还有的兄弟说我介绍的根本不对,那我就抽空研究了一下,和大家一起学习。但是本文的内容太底层了,我个人觉得了解即可。。。) 为了保证volatile变量的可见性和禁止指令重排序,Java会在生成的字节码...