logo头像
书院的十三先生

Java并发编程入门(十八)再论线程安全

一、无需加锁的线程安全场景如下几种场景无需加锁就能做到线程安全: 1.不变对象 2.线程封闭 3.栈封闭 4.ThreadLocal I、不变对象经典并发编程描述对象满足不变性有以下条件: 1.对象创建后状态就不再变化。...

Java并发编程入门(十七)一图掌握线程常用类和接口

一、线程常用类和接口线程常用类和接口如下: 1.Thread和Runnable是最常用的,区别是一个是类,一个是接口。类的缺点是只能单继承,而接口没有这个限制。 2.Thread和Runnable没有返回值,想得到线程执行结果,...

Java并发编程入门(十六)正确理解两类线程池

一、例子一网站的请求要记录调用耗时日志,此日志并不是非常重要,不希望影响核心业务流程,要在主流程之外独立处理,因此可以在请求调用完成后由独立线程来记录,处理方式有如下几种: 1.每个请求先将数据放入队列中,由已运行的线程从队列中获...

Java并发编程入门(十五)CyclicBarrier应用场景

一、应用场景现实生活做中有很多这样的场景:做F前需要等待A,B,C,D,E完成,A,B,C,D,E可以并发完成,没有特定顺序,并且F做完后又重新开始,例如:组装汽车前需要先生产轮胎,车门,车身等等。这个场景的特征为: 1.组装汽车...

Java并发编程入门(十四)CountDownLatch应用场景

一、应用场景现实生活做中有很多这样的场景:做F前需要等待A,B,C,D,E完成,A,B,C,D,E可以并发完成,没有特定顺序,例如:周末在家里吃饭,有3件事情要做,爸爸做饭,妈妈做菜,儿子收拾餐桌,摆放碗筷。可以看到这个场景的特征为:...

Java并发编程入门(十三)读写锁和缓存模板

一、读写锁提到读写锁,都能想到是锁优化方式之一的锁分离,实现效果是读读不互斥,读写互斥,写写互斥。 读写锁本身比较简单,下面通过一个例子看看读写锁的使用。1.Cache是一个抽象类,实现了缓存的基本方法,子类只需要实现init方法...

Java并发编程入门(十二)生产者和消费者模式-代码模板

一、应用场景生产者和消费者模式应用于异步处理场景,异步处理的好处是生产者和消费者解耦,不互相依赖,生产者不需要等待消费者处理完,就可以持续生产消费内容,效率大大提高。 二、代码类结构生产者和消费者代码类结构如下:1.Blocked...

Java并发编程入门(十一)限流场景和Spring限流器实现

一、限流场景限流场景一般基于硬件资源的使用负载,包括CPU,内存,IO。例如某个报表服务需要消耗大量内存,如果并发数增加就会拖慢整个应用,甚至内存溢出导致应用挂掉。 限流适用于会动态增加的资源,已经池化的资源不一定需要限流,例如数...

Java并发编程入门(十)锁优化

一、锁优化锁的优化如下:1.使用无锁方案2.避免死锁3.减小锁持有时间4.锁分离5.锁粗化6.减小锁粒度 无锁方案单独介绍,避免死锁可参考:Java并发编程入门(九)死锁和死锁定位。 二、减小锁持有时间只对有同步需要的代码块做...

Java并发编程入门(九)死锁和死锁定位

一、死锁条件死锁:一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。 满足死锁的四个条件:1.互斥,共享资源 X 和 Y 只能被一个线程占用2.占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源Y的时候,不释放共...