![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java高并发编程
Java高并发编程详解
多线程与架构设计
riabai
Practice makes perfect
展开
-
Hook线程以及捕获线程执行异常
1、获取线程运行时异常1.1、在Thread类中,关于处理运行时异常的API总共有四个,如下所示:public static void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) :为某个特定线程指定UncaughtExceptionHandlerpublic static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) :设置全局的..原创 2020-11-20 17:06:58 · 270 阅读 · 0 评论 -
ThreadGroup的基本操作
activeCount()用于获取group中活跃的线程,这只是个估计值,并不能百分之百的保证数字一定正确(比如在调用后,某个线程结束了生命周期或者新的线程加如了进来都会导致数据的不准确),该方法会递归获取其他子group中的活跃线程activeGroupCount() 用于获取group中活跃的子group,这也是一个近似估值,该方法也会递归获取所有的子groupgetMaxPriority()用于获取group的优先级,默认情况下,Group的优先级为10,在该group中,所有线程的优先级都不原创 2020-11-20 14:47:24 · 434 阅读 · 0 评论 -
synchronized关键字的缺陷——自定义显式锁BooleanLock
1、synchronized关键字的缺陷 synchronized关键字提供了一种排他式的数据同步机制,某个线程zaihuoqmonitorlock的时候可能会被阻塞,而这种阻塞有两个很明显的缺陷: 第一,无法阻止阻塞时长 第二,阻塞不可被中断下面通过示例来分析,如下:package com.practice.concurrent.chapter5;import java.util.concurrent.TimeUnit;public class Sync...原创 2020-11-12 15:12:24 · 333 阅读 · 0 评论 -
wait和notify方法详解
wait和notify方法并不是Thread特有的方法,而是Object中的方法1、我们先来说说wait方法,下面是wait方法的三个重载方法(第一个是native方法):public final native void wait(long timeout) throws InterruptedException;public final void wait() throws InterruptedExceptionpublic final void wait(long timeout,原创 2020-11-12 10:47:09 · 2285 阅读 · 0 评论 -
synchronized关键字之死锁的原因
1、交叉锁可导致程序出现死锁线程A持有R1的锁等待获取R2的锁,线程B持有R2的锁等待获取R1的锁(典型的哲学家吃面),这种情况最容易导致程序发生死锁的问题,示例如下:package com.practice.concurrent.chapter04.sync;public class DeadLock { private final Object MUTEX_READ=new Object(); private final Object MUTEX_WRITE=new Obj原创 2020-11-11 17:38:14 · 1042 阅读 · 0 评论 -
synchronized作用this monitor和Class monitor
1、thismonitorsynchronized关键字直接写在非静态方法上的method1效果和作用在thismonitor的method2效果等同。注意:由于作用的是thismonitor,所以该对象在调用method1的时候,thismonitor加锁会导致该对象其他争抢该锁的方法进入阻塞(即method1执行过程中会导致method2阻塞,反之亦然)package com.practice.concurrent.chapter04.sync;import java.uti...原创 2020-11-11 16:40:56 · 615 阅读 · 1 评论 -
synchronized monitorenter和monitorexit
synchronized关键字提供了一种互斥极致追击,也就是说在同一时刻,只能有一个线程访问同步资源,很多资料、书籍将synchronized(mutex)称为锁,其实这种说法是不严谨的,准确的讲应该是某线程获取了与mutex关联的monitor锁(当然写程序的时候知道它想要表达的意思即可)注意:javap反编译观察指令可以发现monitorenter和monitorexit是成对出现的(有些时候会出现一个monitorenter多个monitorexit,但是每一个monitorexit之前必有对应.原创 2020-11-11 16:05:43 · 1499 阅读 · 0 评论 -
Thread 如何关闭一个线程
前言:JDk有一个Deprecated方法stop,但是该方法存在一个问题,JDK官方早已经不推荐使用,骑在后面的版本中有可能会被移除,根据官网的描述,该方法在关闭线程时可能不会释放掉monitor的锁,所以强烈建议不要使用该方法结束线程。推荐方式:1、线程结束生命周期正常结束线程运行结束,完成了自己的任务之后,就会正常退出。2、捕获中断信号关闭线程我们通过newThread的方式创建线程,这种方式看似很简单,其实他的派生成本是比较高的,因此在一个线程中往往会循环的执行某个任务,比如心.原创 2020-11-10 16:33:22 · 3149 阅读 · 0 评论 -
Thread join方法结合实战
该例子是典型的串行任务局部并行化处理,用户在App客户端输入出发地“北京”和目的地上海,服务器接收到这个请求之后, 先来验证用户的信息,然后到各大航空公司的接口查询信息,最后经过整理加工返回给客户端,每一个航空公司的接口不会都一样, 获取的数据格式也不一样,查询的速度也存在这差异,如果再跟航空公司进行串行化交互(逐个的查询),很明显客户端需要等待很长的时间。 这样的话,用户的体验很差。我们将每一个航空公司的查询都交给一个线程去做,然后再他们结束工作之后统一对数据进行整理, 这样就可以极大的节约...原创 2020-11-10 16:12:39 · 117 阅读 · 1 评论 -
Thread sleep和yield的区别
Thread sleep和yield的区别1、sleep会导致当前线程暂停指定的时间,没有cpu时间片的消耗2、yield只是对cpu调度器的一个提示,如果cpu调度器没有忽略这个提示,他会导致线程上下文的切换3、sleep会使线程短暂block,会在给定的时间内释放cpu资源4、yield会使Running状态的Thread进入Runnable状态(待执行状态,如果cpu调度器没有忽略这个提示的话)5、sleep几乎百分之百的完成了给定时间的休眠,而yield的提示并不能一定担保6原创 2020-11-09 16:51:54 · 1030 阅读 · 0 评论