多线程
虎哥和你一起学编程
路漫漫其修远兮吾将上下而求索
展开
-
接口合并提升并发量
在高并发接口设计的过程中有一个技巧就是可以采用接口合并的策略。它的前提是要求下游接口要提供批量的接口。 首先为每一个请求分配一个唯一的标识号来表示该次请求,然后将请求入队列,通过定时任务每隔10ms去队列里面拉一批请求,然后组装成批量请求的参数来发请求,然后收到结果以后,再根据唯一标识来将结果赋予对应的请求。即可以完成降低io请求次数的目的,提高并发性。...原创 2021-11-28 15:40:50 · 841 阅读 · 0 评论 -
商品详情页使用CompletableFuture异步调用
通产在商品详情页需要根据商品id调用其他的服务,获取商品的其他信息,这时可以使用CompletableFuture来调用其他的服务,进行调用,最后把结果合起来,返回结果。例如如下://1.获取商品的a信息CompletableFuture<Object> aFuture = CompletableFuture.supplyAsync(() -> **);//2.获取商品的b信息CompletableFuture<Object> bFuture ...原创 2021-09-09 14:41:39 · 171 阅读 · 0 评论 -
线程池的执行过程
线程池的执行过程有很多人都很模糊,今天就通过一张图来理解一下线程池的执行过程。原创 2021-05-10 20:31:36 · 113 阅读 · 0 评论 -
parallelStream导致LinkedList遍历时空指针的问题
最近在开发中遇到一个问题,在遍历一个LinkedList时偶然性的会发生空指针。前面儿是通过parrallelStream往这个LinkedList里面添加元素,导致的这个问题,parrallelStream是并行流,而LinkedList和ArrayList都不是线程安全的,就可能会导致这个问题。例如下面一段代码,运行几次,偶然就会出现空指针 public class TestLinkedList { public static void main(Str...原创 2020-06-09 11:49:52 · 2452 阅读 · 2 评论 -
如何唤醒指定的线程
我们在学习多线程的时候,应该会用过synchronize/wait/notify的组合,但是notify并不能指定唤醒哪一个线程,但是从jdk6之后提供了一个LockSupport类,可以通过它来唤醒指定的线程。 下面来实现一个简单的例子。 public class StatePatternDemo { public static void m...原创 2019-05-28 10:19:40 · 3185 阅读 · 1 评论 -
两阶段终止的方式来终止一个线程(Two phase Terminated Pattern)
Thread.stop方法可以停止一个线程,但并不优雅,此处的优雅的意思可以理解成线程安全或者做来一些善后的操作或者中止的操作,在《多线程设计模式》这本书中介绍了一种设计模式---两阶段终止模式,两阶段终止模式包含两个阶段:1.准备终止阶段2.终止阶段。示例代码如下 public class TerminalThread extends Thread ...原创 2019-05-13 11:57:44 · 413 阅读 · 0 评论 -
如何优雅的停止一个线程
Thread类提供了一个stop方法,可是这个方法已经过时了,jdk官方也推荐不使用。原因是stop方法是通过抛出一个ThreadDeath的Error来让线程直接停止的,如果是在同步代码块中,它会释放锁。 stop方法停止线程就像按开关键来关机一样,它是没有进行一些善后的处理的。 下面就通过一个例子来演示一下stop方法会释放锁。 pub...原创 2019-05-13 09:45:41 · 969 阅读 · 0 评论 -
关于线程安全的一些理解
我们平常在开发多线程程序时,经常会考虑到线程安全的问题,很多人如果问它什么是线程安全,可能都只是有一个模糊的概念,讲不清楚,这里引用一下<<深入理解java虚拟机>> 里面关于线程安全的描述: 线程安全是指在多线程程序里面,如果对一个类,对象,方法,变量的操作不需要做额外的加锁,同步等操作,我们就认为它是线程安全的。 在网上有另...原创 2019-05-08 09:29:02 · 1247 阅读 · 0 评论 -
关于wait/notify的一些问题
Object类中提供了对象锁,其他的类都是继承自Object类,也都有对象锁,wait方法的作用是让持有对象锁的线程阻塞,直至被notify/notifyAll方法来唤醒,notify/notifyAll方法的作用是唤醒等待对象锁的线程。其中notify只随机唤醒一个当前等待对象锁的线程,而notifyAll则是唤醒当前所有等待对象锁的线程。 今天看到...原创 2019-05-10 16:38:03 · 721 阅读 · 1 评论 -
创建线程的三种方式
随着计算机硬件的发展,多核CPU已经变得很普及,并行已经随处可见,在这种大的环境下,多线程的开发正在变的日益重要,多线程对程序的性能提升也越发的明显。 创建线程有三种方式, 1.继承Thread类。public class Demo1 { public static void main(String[] args) { ...原创 2019-04-25 09:11:17 · 158 阅读 · 0 评论 -
java并发编程之AQS讲解(一)
提到java的并发编程,我们就绕不过老生长谈的CAS和AQS,这一篇我们主要讲解AQS,AQS(AbstractQueueSynchronized),这个类中提供了一个FIFO队列,这个类是为很多其他的并发工具类提供了最基本的支持。通过维护一个volatile int state的常量的同步操作来判断是否获得锁。 这个类中主要提供了独占和共享两种锁,分别对应tryAc...原创 2019-04-24 09:38:41 · 196 阅读 · 0 评论 -
CAS的ABA问题
CAS(CompareAndSwap)比较替换是一种无锁的并发安全控制方式,通过预期值与当前值比较是否相同来判断是否有其他的线程同时修改共享资源,但是CAS中会存在一个ABA的问题,所谓的ABA问题值的是CAS的比较结果是正确的(即预期值与当前值相同),但是可能在其中经历了A->B->A的过程。 即其他的线程先把当前值由A修改为了B,然后又修改为了A,那么通过CAS的视角,...原创 2019-04-28 09:03:52 · 148 阅读 · 0 评论 -
详解 CountDownLatch类
CountDownLatch这个类是一个同步的辅助类,有的地方翻译成门闩,有的地方翻译成计数器。具体来说起到什么作用,多线程的东西都不太能说清楚,仅举个例子再来谈一下。 需求:在主线程里面开启两个线程,两个线程要做自己的事情,你可以怎么做,你可以用原生的API来做,例如这样:Thread t1=new Thread(()->{ try{ //TO...原创 2019-04-23 16:01:57 · 965 阅读 · 0 评论 -
CyclicBarrier讲解
在j.u.c并发包中,还提供了一个让多个线程同时到达一个同步点的工具类CyclicBarrier,有的地方翻译为栅栏,即可以让CyclicBarrier管理几个线程,例如下图:如上图所示,当多个线程被CyclicBarrier管理时,必须所有的线程都到达同步点,方能继续向下执行。下面来写一些示例代码。public class TestCyclicBarrier {...原创 2019-04-27 16:11:10 · 298 阅读 · 0 评论 -
Exchanger讲解
同步辅助工具类中的Exchanger的作用是在成对的线程之间相互传递消息,通过exchange()方法进行交换数据。例如如下示例:public class TestExchanger { public static void main(String[] args) throws InterruptedException { Exchanger<Peo...原创 2019-04-26 09:11:45 · 279 阅读 · 0 评论 -
线程之间通信之消费者生产者问题
多线程在java开发中是非常重要的一环,因为它充分利用了CPU的特性,尤其现在多核CPU的发展。很多时候能大大的提高性能,像tomcat服务器就利用了多线程,这才有并发问题。 线程共有五个状态:新生、就绪、运行、阻塞、死亡 其中需要注意一点的是:同步块中如果线程sleep了,是不会释放锁的,这个也是我们下面要谈的线程之间通信利用wait和Notify 的不同之处。 线程之间通信,首先...原创 2018-03-01 23:00:07 · 229 阅读 · 0 评论