Java多线程进阶
java多线程进阶学习
程铭程铭你快成名
这个作者很懒,什么都没留下…
展开
-
Java多线程进阶(十八):Java 8 Stream并行计算
从Java 8 开始,我们可以使用Stream接口以及lambda表达式进行“流式计算”。它可以让我们对集合的操作更加简洁、更加可读、更加高效。Stream接口有非常多用于集合计算的方法,比如判空操作empty、过滤操作filter、求最max值、查找操作findFirst和findAny等等。什么是并行计算假如我的计算机是一个多核计算机,我们在理论上能否利用多核来进行并行计算,提高计算效率...原创 2020-03-20 14:35:22 · 1826 阅读 · 0 评论 -
Java多线程进阶(十六):CountDownLatch
CountDownLatch介绍先来解读一下CountDownLatch这个类名字的意义。CountDown代表计数递减,Latch是“门闩”的意思。也有人把它称为“屏障”。而CountDownLatch这个类的作用也很贴合这个名字的意义,假设某个线程在执行任务之前,需要等待其它线程完成一些前置任务,必须等所有的前置任务都完成,才能开始执行本线程的任务。CountDownLatch的方法也很简...原创 2020-03-20 14:23:13 · 1203 阅读 · 0 评论 -
Java多线程进阶(十五):线程池的使用
为什么要使用线程池创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程。控制并发的数量。并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃。(主要原因)。可以对线程做统一管理。线程池的原理Java中的线程池顶层接口是Executor接口,ThreadPoolExecutor是这个接口的实现类。我们先看一下Executor。public interface Exec...原创 2020-03-20 14:10:14 · 1289 阅读 · 0 评论 -
Java多线程进阶(十四):CopyOnWrite容器
什么是CopyOnWrite容器在说到CopyOnWrite容器之前我们先来谈谈什么是CopyOnWrite机制,CopyOnWrite是计算机设计领域中的一种优化策略,也是一种在并发场景下常用的设计思想——写入时复制思想。那什么是写入时复制思想呢?就是当有多个调用者同时去请求一个资源数据的时候,有一个调用者出于某些原因需要对当前的数据源进行修改,这个时候系统将会复制一个当前数据源的副本给调用...原创 2020-03-20 10:44:06 · 1190 阅读 · 0 评论 -
Java多线程进阶(十三):从ConcurrentHashMap能学到哪些并发编程技巧?
ConcurrentHashMap是Doug Lea所写。它在JDK 1.7中用的是“分段锁”的思想,但在JDK 1.8中几乎重写了一遍,把数据结构简化成与HashMap类似,减小了锁的粒度,大道至简,进一步提升了它在多线程下的性能。这篇文章主要总结一下在ConcurrentHashMap源码学习过程中学到的一些并发编程的思想和技巧。使用volatile进行通信在ConcurrentHash...原创 2020-03-20 10:38:54 · 10659 阅读 · 2 评论 -
Java多线程进阶(十二):并发容器之ConcurrentHashMap
我们知道在java.util包下提供了一些容器类,而Vector和HashTable是线程安全的容器类,但是这些容器实现同步的方式是通过对方法加锁(sychronized)方式实现的,这样读写均需要锁操作,导致性能低下。ConcurrentMap接口ConcurrentMap接口继承了Map接口,在Map接口的基础上又定义了四个方法:public interface ConcurrentMa...原创 2020-03-20 10:34:09 · 1270 阅读 · 0 评论 -
Java多线程进阶(十一):ReentrantReadWriteLock
前面提到ReentrantLock,是一种“排它锁”。也就是说,这些锁在同一时刻只允许一个线程进行访问。而读写锁可以再同一时刻允许多个读线程访问。Java提供了ReentrantReadWriteLock类作为读写锁的默认实现,内部维护了两个锁:一个读锁,一个写锁。ReadWriteLock接口这里面有两把锁,一把读锁,用来处理读相关的操作;一把写锁,用来处理写相关的操作。public in...原创 2020-03-20 09:21:39 · 1299 阅读 · 0 评论 -
Java多线程进阶(十):ReentrantLock和Condition
Java在java.util.concurrent.locks包下,还为我们提供了几个关于锁的类和接口,相对于synchronized它们有更强大的功能或更高的性能。锁的分类可重入锁和非可重入锁所谓重入锁,顾名思义。就是支持重新进入的锁,也就是说这个锁支持一个线程对资源重复加锁。synchronized关键字就是使用的重入锁。比如说,你在一个synchronized实例方法里面调用另...原创 2020-03-19 16:54:40 · 1418 阅读 · 0 评论 -
Java多线程进阶(九):线程安全和死锁
什么叫线程安全?线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。如果线程不安全会出现什么情况?举个例子,正常情况下,一张火车票只能卖给一个人,但是在售票的核心代码块的地方你并没有加锁,就可能会出现线程不安全的情况,从而导致一张火车票可能会卖给多个人的情况发生。stat...原创 2020-03-19 14:51:14 · 1259 阅读 · 0 评论 -
Java多线程进阶(八):乐观锁和悲观锁
锁可以从不同的角度分类。其中,乐观锁和悲观锁是一种分类方式。悲观锁悲观锁就是我们常说的锁。对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。乐观锁乐观锁又称为“无锁”,顾名思义,它是乐观派。乐观锁总是假设对共享资源的访问没有冲突,线程可以不停地执行,无需加锁也无需等待。而一旦多个线程发生冲突,乐观锁通常是使...原创 2020-03-19 14:20:26 · 1288 阅读 · 0 评论 -
Java多线程进阶(七):CAS
CAS的概念CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:V:要更新的变量(var)E:预期值(expected)N:新值(new)比较并交换的过程如下:判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。CAS的过程我们以一个简单的例子来解释这个过程:如果有一个多个...原创 2020-03-19 11:27:38 · 1202 阅读 · 0 评论 -
Java多线程进阶(六):Volatile
在多线程并发编程中 synchronized 和 Volatile 都扮演着重要的角色,Volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。内存可见性内存可见性,指的是线程之间的可见性,当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值。使用Volatile关键字之后,可以强制从公共内存中读取变量的值。所谓内存可见性...原创 2020-03-18 18:00:26 · 1164 阅读 · 0 评论 -
Java多线程进阶(五):Synchronized和锁
首先需要明确的一点是:Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁,也就是说我们常听到的类锁其实也是对象锁。synchronized这个关键字,它翻译成中文就是“同步”的意思。通常使用synchronized关键字来给一段代码或一个方法上锁。关键字在实例方法上,锁为当前实例public synchronized void instanceLock() { ...原创 2020-03-18 16:31:35 · 1355 阅读 · 0 评论 -
Java多线程进阶(四):Java线程的状态
首先从一张图片来直观的了解一下线程的状态,图片来源于网络。然后再看一下Thread.State这个枚举类,定义了线程的六种状态。 public enum State { /** * 处于NEW状态的线程此时尚未启动。 * 指的是线程建好了,但是并没有调用Thread实例的start()方法。 */ NEW,...原创 2020-03-18 14:45:50 · 1285 阅读 · 0 评论 -
Java多线程进阶(三):Callable、Future与FutureTask
通常来说,我们使用Runnable和Thread来创建一个新的线程,但是它们是没有返回值的。而有时候我们希望开启一个线程去执行一个任务,并且这个任务执行完成后有一个返回值。那么JDK提供了Callable接口与Future类为我们解决这个问题,这也是所谓的“异步”模型。Callable接口可以看到Callable是一个函数式接口。同时Callable是有返回值的,并且支持泛型。@Funct...原创 2020-03-18 10:34:26 · 1218 阅读 · 0 评论 -
Java多线程进阶(二):Thread类和Runnable接口
如果我们需要有一个“线程”类,JDK提供了Thread类和Runnalble接口来让我们实现自己的“线程”类。继承Thread类,并重写run方法(注意:Thread类实现了Runnable接口)public class Thread implements Runnable { }实现Runnable接口的run方法继承Thread类 static class MyThread...原创 2020-03-17 19:13:48 · 1345 阅读 · 0 评论 -
Java多线程进阶(一):进程与线程的基本概念
进程产生的背景最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。这样效率非常低下,在很多时候,计算机都处在等待状态。批处理操作系统后来有了批处理操作体统,把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。...原创 2020-03-17 17:32:03 · 1215 阅读 · 0 评论