java多线程
reachwang
这个作者很懒,什么都没留下…
展开
-
CountDownLatch原理解剖
先看一下这个类是怎么用的,因为我们知道,可能要执行一个任务的时候需要等待其他任务执行完毕才可进行。比如当前某个线程需要“断一栋大楼的电”,它需要所有其他要用电的线程(工作人员)执行完任务后才能“断电”。这个过程有时候会用到Thread.join()方法,让当前线程阻塞,直到其他线程执行完毕为止。但是并不灵活,何况实际应用中可能往往这些子线程是一个个的Runnable来交给线程池运行,不能执行joi...原创 2019-11-21 20:36:58 · 309 阅读 · 0 评论 -
LongAdder原理
前面介绍了Java中的一些原子类,但是基本都是通过CAS来实现原子性操作,白白浪费CPU资源。JDK8中新增了一个原子性递增或者递减类LongAdder用来克服高并发下使用AtomicLong的缺点。LongAdder的思路是把一个变量分解为多个变量,让同样多的线程去竞争多个资源。如图所示:使用LongAdder时,内部维护了多个Cell变量,每个Cell里面有一个初始值为0的long型变量,...原创 2019-10-24 21:08:09 · 4037 阅读 · 2 评论 -
Java中的伪共享问题
我们知道未解决CPU与内存速度不一致问题,会在他俩中间添加一级或多级高速缓冲存储器(Cache),在Cache内部是按行存储的,每一行成为一个Cache行。Cache行是Cache与主内存进行数据交换的单位,大小一般为2的幂次数字节。当CPU访问某个变量的时候,首先会看CPU Cache内是否有该变量,如果有则直接取走,否则去主内存里获取该变量,并把该变量所在内存区域的一个Cache行大小的内存...原创 2019-10-22 15:14:40 · 208 阅读 · 0 评论 -
Java中的守护线程与用户线程
Java中的线程分为两类,分别为daemon线程(守护线程)和user线程(用户线程)。JVM启动时调用main函数,main函数所在的线程就是一个用户线程,当然启动的时候JVM内部还启动了好多守护线程,比如垃圾回收线程。那两者区别在哪呢?当最后一个非守护线程结束时,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。只要用户线程没结束,那么JVM就不会退出。...原创 2019-10-03 22:34:37 · 278 阅读 · 0 评论 -
java中Thread常见方法与线程状态对应关系
一个线程通常有6种状态:初始态、等待态、就绪态、运行态、阻塞态、终止态。java中初始态就是线程刚刚new出来的时候,运行原创 2019-06-04 23:57:05 · 542 阅读 · 0 评论 -
线程的概念和创建
什么是线程最常见的一个问题就是询问线程和进程的区别。进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。而CPU资源是被分配到线程的,所以线程是CPU分配的基本单位。所以在Java中,当我们启动main函数时其实启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也...原创 2019-09-26 22:26:32 · 103 阅读 · 0 评论 -
线程池ThreadPoolExecutor原理
线程池的出现为了解决两个问题:一是性能问题。因为线程的创建和销毁都是需要开销的,所以可以复用线程池里的线程,从而不需要每次执行异步任务都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可限制线程个数或动态增加线程等。Executor的工厂方法提供了许多种线程池(静态方法),从而满足不同需求,比如newCachedThreadPool(线程池线程个数最多可达Integer.MAZ...原创 2019-09-26 21:18:36 · 181 阅读 · 0 评论 -
Java中的原子操作类Atomic
由于Java中变量会有多种类型,所以Atomic包中提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。其实实现原理都是对Unsafe类中一些方法的包装。1. 原子更新基本类型使用原子的方式更新基本类型,Atomic包提供了一下3个类。AtomicBoolean:原子更新布尔类型。AtomicInteger:原子更新整形...原创 2019-09-13 23:16:25 · 414 阅读 · 0 评论 -
CopyOnWriteArrayList原理解析
CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。如图所示是CopyOnWriteArrayList的类图结构:能够看到,每个CopyOnWriteArrayList对象都有一个array数组用来存放具体元素,而ReenTrantLock则用来保证只有一个线程对Array进行修改。...原创 2019-09-07 12:57:39 · 5129 阅读 · 1 评论 -
LockSupport工具类
LockSupport工具类主要用来挂起和唤醒线程。它会与每个使用它的线程关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。底层实现也是使用的Unsafe类。介绍一下几个函数:void park()方法若调用park方法的线程已经拿到了与LockSupprot关联的许可证,则调用LockSupport.par()时会马上返回,否则调用线程会被禁止参与线程调度...原创 2019-06-18 00:00:58 · 215 阅读 · 0 评论 -
ThreadLocal及InheritableThreadLocal类实现原理
Thread使用方法ThreadLocal提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程其实都会有次变量的一个本地副本。所以多线程访问次变量实际操作的时自己线程本地内存里面的变量。直接上例子:static ThreadLocal<String> localVariable = new ThreadLocal<>();...原创 2019-06-09 10:13:22 · 975 阅读 · 0 评论 -
ThreadLocalRandom类原理
这是一个随机数生成器,而我们比较常用的是Random类,但是它是有一定的局限性。首先看一下Random生成随机数过程Random类实现及局限我们常用的一个方法是Random.nextInt(),那就以它作为例子:public int nextInt (int bound) { if (bound <= 0) throw new IllealArgumentException(Ba...原创 2019-06-12 23:44:34 · 2201 阅读 · 5 评论