并发编程
王云召
这个作者很懒,什么都没留下…
展开
-
【并发编程】CountDownLatch与CyclicBarrier
CountDownLatch简介CountDownLatch,意思是倒数门闩。它的作用是多个线程做汇聚。主线程开启了 A、B、C 三个线程做不同的事情,但是主线程需要等待 A、B、C 三个线程全部完成后才能继续后面的步骤。此时就需要 CountDownLatch 出马了。CountDownLatch 会阻塞主线程,直到计数走到 0,门闩才会打开,主线程继续执行。而计数递减是每个线程自己操作 CountDownLatch 对象实现的。这种场景很常见:篮球比赛中,作为控球后卫,如果没有快攻机会,..原创 2020-05-23 19:55:29 · 244 阅读 · 0 评论 -
【并发编程】线程池--Executor框架
简介我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等。线程用于执行异步任务,单个的线程既是工作单元也是执行机制,Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机原创 2020-05-21 20:56:41 · 137 阅读 · 0 评论 -
【并发编程】volatile简单使用
Atomic 以更为轻量的方式实现原子性。。本次我们学习volatile 关键字,则是用来解决可见性、有序性问题。简介在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,就需要把变量声明为volat.原创 2020-05-21 20:56:26 · 156 阅读 · 0 评论 -
【并发编程】Atomic与CAS
Atomic 相关类在 java.util.concurrent.atomic 包中。针对不同的原生类型及引用类型,有 AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference 等。另外还有数组对应类型 AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。由于 Atomic 提供的功能类似,就不一个个过了。我们以 AtomicInteger 为例,看看 Atomic 类型变量所能提供的功能。..原创 2020-05-21 20:56:03 · 693 阅读 · 0 评论 -
【并发编程】JAVA内存模型
JAVA内存模型即JMM(Java Memory Model),有些人会和Java内存结构混淆。虽然两者名字很接近,但描述的为不同内容。Java内存结构描述的是JVM对内存的逻辑划分,我们在学习垃圾回收和JVM优化的时候会关心JVM内存结构。而本节所讲的JMM,实际上是一种规范。它描述了Java程序的运行行为,包括多线程操作对共享内存读取时,所能读取到的值应该遵守的规则。...原创 2020-05-21 20:55:30 · 134 阅读 · 0 评论 -
【并发编程】并发编程的三大特性
并发编程的书籍都会讲到并发编程的三大特性,这是并发编程中所有问题的根源,我们只有深刻理解了这三大特性,才不会编写出漏洞百出的并发程序。基本概念1、原子性,所有操作要么全部成功,要么全部失败。2、可见性,一个线程对变量进行了修改,另外一个线程能够立刻读取到此变量的最新值。3、有序性,代码在运行期间保证按照编写的顺序。为什么会有并发编程特性?线程切换导致了原子性问题对于变量a来说,我们对其执行以下代码a++;此时需要分三步执行:(1)读取a的值(2)将a的值加1原创 2020-05-21 20:55:02 · 1174 阅读 · 0 评论 -
【并发编程】线程等待、通知(wait/notify)
了解了在 Java 中如何启动一个线程,并且学习了 Thread 类的 API 以及线程的状态,接下来我们学习一下线程之间的等待和通知,也就是wait/notify。wait/notify 概念当前线程启动后,调用对象的wait()方法,当前线程释放对象锁,从运行态进入阻塞态,然后进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒,再继续进入运行态,继续执行。还有notify()唤醒在此对象监视器上等待的单个线程,选原创 2020-05-21 20:54:41 · 318 阅读 · 0 评论 -
【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)
在说锁之前,我们要明白为什么要加锁,不加锁会怎样?在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题。取钱的流程可以分为一下几个步骤:1.用户输入账户,密码,系统判断用户的账户,密码是否正确。 2.用户输入取款金额 3.系统判断账户余额是否大于取款金额 4.如果余额大于取款金额,取款成功;小于取款金额,取款失败。假设现在有一账户,内有1000元,两人同时取钱,看下面用代码模拟的情况。public class Account {原创 2020-05-21 20:54:17 · 237 阅读 · 0 评论 -
【并发编程】线程中的Sleep、Yield、Join等api方法方法线程状态转换
在上两篇中我们学习线程的概念和如何创建线程,在本篇中我们学习一些线程的方法和线程的状态。方法Sleep:线程睡眠线程休眠指的是让线程暂缓执行以一下,等到了预计时间之后再恢复执行参数是毫秒。当线程启动后,再调用sleep方法,可以让线程进入特定时间的阻塞状态,当时间过去后,在进入运行态。示例代码如下:public class T03_Sleep { public sta...原创 2020-05-05 20:05:16 · 337 阅读 · 1 评论 -
【并发编程】创建线程的四种方式
上一篇我们初步认识了线程,现在我们来讲一下,创建线程的三种方式1.继承Thread类通过继承thread类,然后重写run方法(run方法中是线程真正执行的代码,runable也是如此)即可。当子类被实例化后,调用start方法即可启动线程。(不能调用run方法,直接调用run方法,和方法调用没有区别,不是线程。)这种继承thread创建线程的方式,线程之间无法共享实例变量,因为每次都...原创 2020-05-05 16:57:21 · 220 阅读 · 0 评论 -
【并发编程】对线程的初步认识
简介线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。通俗点说:一个程序被启动执行就是一个进程。一个进程的最小执行单元就是线程。系统中的进程线程模型是这样的:进程从操作系统获得基本的内存空间,所有的线程共享着进程的内存地址空间。当...原创 2020-05-05 15:47:16 · 148 阅读 · 0 评论