随笔分类 -  多线程

1

数据库连接池的一种实现方案
摘要:数据库连接池有多个开源实现,像dbcp、druid等。这里我们再一次造轮子,思路很简单:当有SQL操作(增删查改)到来时,先到池子里看一眼,如果有可用的连接,拿来用,没有就新建一个连接。连接不在新建时入池,而是在被关闭时。本来应当被系统回收的连接被放入池中复用,当累计到最大连接数时,就不再入池,直接 阅读全文

posted @ 2020-12-16 22:46 不想下火车的人 阅读(362) 评论(0) 推荐(0) 编辑

利用jvisualvm.exe搞一个关于生产者消费者的另一些纠结的问题
摘要:在利用jvisualvm.exe搞一个关于生产者消费者的一个纠结的问题中,我们已经看到如何在生产者消费者模型中,由于队列的不安全导致消费者一直空转的情况,并通过使用线程安全的队列去解决该问题。接下来我们继续跟踪该问题的其他几种并发情况,现在先把生产者代码中使消费者优先执行的关键那一行休眠注释掉,还是 阅读全文

posted @ 2020-07-08 23:49 不想下火车的人 阅读(147) 评论(0) 推荐(0) 编辑

利用jvisualvm.exe搞一个关于生产者消费者的一个纠结的问题
摘要:先看代码: package com.wlf.service; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; /** * 生产者消费者模拟 * 阅读全文

posted @ 2020-07-08 22:14 不想下火车的人 阅读(273) 评论(0) 推荐(0) 编辑

可重入的读写锁
摘要:读写锁同样存在着重入问题。简单的读写锁见读写锁浅析。这里我们拿这个简单的写锁来做一个重入测试: @Test public void testNonReentrantLock() { MyReadWriteLock lock = new MyReadWriteLock(); new Thread(() 阅读全文

posted @ 2019-01-14 15:02 不想下火车的人 阅读(451) 评论(0) 推荐(0) 编辑

读写锁浅析
摘要:所谓读写锁,即是读锁和写锁的统称,它是两种锁,但放在同一个对象里,通过两个方法分别获取。适用场景是读多写少的业务,比如缓存。用法很简单,三原则:读读共享、读写互斥、写写互斥。换种说法:读锁是共享的,读锁允许其他线程的读操作,而写锁是互斥的,写锁不允许其他线程的读写操作。 但此处有一个问题先提出来:正 阅读全文

posted @ 2019-01-09 18:16 不想下火车的人 阅读(1309) 评论(0) 推荐(0) 编辑

公平的自旋锁
摘要:之前我们了解了自旋锁(见自旋锁浅析),现在来看看怎么让自旋锁变得公平。何谓公平?假如现在有10个线程来抢锁,按顺序排队,0号线程是第一个,9号线程是最后一个,把锁从0号依次传递到9号,这就是公平的。反之,不按先来后到的顺序来,就是不公平的。 那么怎么实现公平?结合现实生活中的例子,我们去银行或者医院 阅读全文

posted @ 2018-12-26 19:50 不想下火车的人 阅读(839) 评论(0) 推荐(0) 编辑

可重入的自旋锁
摘要:之前我们粗浅的介绍了自旋锁(参见自旋锁浅析),这次主要介绍它的变种。 首先是可重入自旋锁。参照之前的实现代码,我们可以了解到,当一个线程第一次已经获取到了自旋锁,如果在锁释放之前又一次重新获取该锁,第二次就不能成功获取到。看例子: @Test public void testNotReentrant 阅读全文

posted @ 2018-12-24 17:01 不想下火车的人 阅读(624) 评论(0) 推荐(0) 编辑

自旋锁浅析
摘要:自旋锁的洋名叫spin lock,是一种比较有个性的锁,因为它站在传统的互斥锁的对立面。如果并发时,互斥锁的做法是让线程阻塞,但自旋锁却不这么做,而是原地打转,不停的去抢锁,抢不到誓不罢休。简而言之,互斥锁是重量级(悲观)锁,自旋锁是轻量级(乐观)锁。自旋锁使用场景是:1、多核处理器,2、线程等待锁 阅读全文

posted @ 2018-12-20 20:40 不想下火车的人 阅读(3372) 评论(1) 推荐(1) 编辑

volatile浅析
摘要:volatile的意思是不稳定的、易变的,但在多线程中却跟字面意思一毛钱关系没有。作为一个变量修饰符,它主要有两个作用:一个是告诉大家,该变量是一个在多个线程之间均可见的变量;另一个是告诉java虚拟机,不要对该变量进行指令重排序优化。下面举个例子说明 /** * 测试volatile的作用 * * 阅读全文

posted @ 2018-11-18 19:04 不想下火车的人 阅读(175) 评论(0) 推荐(0) 编辑

并发请求的重复插入问题
摘要:最近被一个并发问题折腾的很惨,特意拿出来分享。把我不开心的事,发出来给大家开心开心。 业务背景:邀请活动,一个用户可以邀请多个用户,比如我可以邀请你,也可以邀请他。但一个用户只能被另一个用户邀请,不允许重复邀请。比如你邀请了我,他就不能再邀请我了。 问题背景:根据业务背景设计了一张被邀请人的表来存储 阅读全文

posted @ 2018-09-10 18:30 不想下火车的人 阅读(2813) 评论(1) 推荐(0) 编辑

线程池的爆掉
摘要:在多线程的世界里,如果源源不断的生产线程的话,内存迟早会被吃光,所以就有了能够重复利用线程的线程池。一个请求到来,从池子中捞起一个空闲的线程,带着该请求去处理事情,事情做完后线程回归池里,等待下一位客人。在池子中的线程可以一遍又一遍的使用,避免了线程创建、销毁的开销,但如果请求的到达率高于线程的处理 阅读全文

posted @ 2018-09-04 07:45 不想下火车的人 阅读(374) 评论(0) 推荐(0) 编辑

多线程的条件对象Condition
摘要:Condition用来显式的定义条件变量,必须与显式锁(Lock的实现类)配套使用。一个显式锁可以配套多个Condition,通过显式锁的newCondition方法得到,条件的判断和Condition的阻塞、通知必须在显式锁的保护下进行。 条件变量对象Condition的await、signal、 阅读全文

posted @ 2017-06-10 23:08 不想下火车的人 阅读(332) 评论(0) 推荐(0) 编辑

锁的公平与非公平
摘要:锁是给线程用的,多线程场景下为了保证线程安全,得在拿到锁之后才能干活。当多个线程竞争一个锁时,同一个时间只能有一个线程能脱颖而出的持有锁,其他线程必须等该线程释放锁后发起下一轮竞争。那么这种竞争就存在公平性问题,如果是公平的竞争,那么这些线程就得按先来后到依次得到锁。这就要求线程们先排好队,前面的线 阅读全文

posted @ 2017-06-10 21:29 不想下火车的人 阅读(454) 评论(0) 推荐(0) 编辑

死锁
摘要:死锁发生的条件有三个: 1.线程个数在两个以上; 2.线程请求的锁的个数在两个以上; 3.线程请求锁是有顺序的。 举个例子:两个线程各自持有的锁刚好是对方线程请求的,结果是彼此相互等待,系统阻塞。因为这种死锁往往是线程持有两个以上的锁,且以不同的顺序请求锁导致的,因此也叫锁顺序死锁。看例子: pac 阅读全文

posted @ 2017-05-23 10:21 不想下火车的人 阅读(378) 评论(0) 推荐(0) 编辑

使用java.util.Timer实现定时任务产生的异常
摘要:定时任务用Timer实现有可能出现异常,因为它是基于绝对时间而不是相对时间进行调度的。当环境的系统时间被修改后,原来的定时任务可能就不跑了。另外需要捕获并处理定时任务抛出的异常。如果在TimerTask里抛出了异常,那么Timer认为定时任务被取消并终止执行线程。举例: package com.wl 阅读全文

posted @ 2017-05-07 23:41 不想下火车的人 阅读(3470) 评论(0) 推荐(0) 编辑

信号量Semaphore使用实例
摘要:信号量就是一个停车场,车位数量的固定的,入场先要取卡获得准入证,出去交钱还证。车位满了后面的车就得排队,等里面有车离场才能进来。可以作为资源池来应用,也可以实现流控。如果停车场很小,只有一个车位进出,那么它就是一个互斥锁。下面举例看下它的应用场景: 1、有界列表: package com.wlf.c 阅读全文

posted @ 2017-05-07 23:31 不想下火车的人 阅读(632) 评论(0) 推荐(0) 编辑

异步计算
摘要:异步计算通过异步获取计算结果,也可以实现类似闭锁CountDownLatch、栅栏CyclicBarrier的功能。它使用Callable来代表一个任务,提交到Executor框架后,可以异步的通过Future来获取任务执行结果。可以通过CompletionService来提交一组任务到一个阻塞队列 阅读全文

posted @ 2017-05-06 21:39 不想下火车的人 阅读(455) 评论(0) 推荐(0) 编辑

栅栏CyclicBarrier
摘要:栅栏作用类似闭锁,不同点在于闭锁是一次性用品,栅栏可重复使用。另外闭锁的await方法是用来阻塞的,栅栏的await方法则类似闭锁的countDown方法,是用来做减法的,当栅栏初始化的个数减为零后,栅栏便执行它在初始化时指定的Runnable.run方法。 下面举例说明,使用线程池来调度多线程: 阅读全文

posted @ 2017-05-06 13:57 不想下火车的人 阅读(243) 评论(0) 推荐(0) 编辑

闭锁CountDownLatch
摘要:顾名思义,闭锁就是用锁来把线程锁起来(调用CountDownLatch对象await方法)。为啥要锁起来呢?可以把锁的钥匙交给另外一个线程,由它来打开(调用CountDownLatch对象的countDown方法)。就好比一座大坝,线程到了大坝就只能蓄起来。一旦闭锁打开所有线程将汹涌倾泻,大坝被冲垮 阅读全文

posted @ 2017-05-02 23:27 不想下火车的人 阅读(247) 评论(0) 推荐(0) 编辑

捕获其他线程的异常UncaughtExceptionHandler
摘要:在A线程里起了另B线程,但B线程报错了,这时想要在A线程里捕获B线程的异常是无法做的,除非在捕获B线程前先设置线程捕获器。直接来看代码: package com.wulf.exceptionHandler; import java.lang.Thread.UncaughtExceptionHandl 阅读全文

posted @ 2017-04-27 11:04 不想下火车的人 阅读(510) 评论(0) 推荐(0) 编辑

1

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示