随笔分类 -  concurrency

摘要:一 . JVM内存结构 在上图之中,我们可以注意到JVM为了加快运行,使用了缓存机制,但是在使用了缓存机制之后,就会出现缓存的不一致性的问题. 下面演示一个代码: 上面的代码之中,我们期望在运行之后,我们设置的符号标记被修改掉,通过这样的方式,我们就能完成对第一个线程的停止. 但是结果出乎我们的意料 阅读全文
posted @ 2018-10-24 14:00 最爱五仁月饼 阅读(128) 评论(0) 推荐(0)
摘要:一 . 概述 我们创建线程的代价是相当大的,线程池就是一个减少线程创建代价的事物.核心就是完成线程创建的任务. 当然当我们将线程的创建工作都交给了线程池,那么线程池就拥有了线程的控制权. 三 .线程池的分类 在JUC之中将线程池分成四类: 我们看一下类的结构. 上面介绍了我们最为常见的四种线程池. 阅读全文
posted @ 2018-05-09 21:50 最爱五仁月饼 阅读(121) 评论(0) 推荐(0)
摘要:一 . 概述 在并发的经典场景之中,有一个读者和写者的问题.其中描述的问题是有写者和读者完成对一个资源的访问,其中读者可以共享的访问的 资源,而写者只能独占的访问资源. 我们看到这个场景之中有独占和共享两个概念. 二 . 读写锁 在JUC之中提供了一个读写锁,通过读写锁可以完成对资源的读写操作,其中 阅读全文
posted @ 2018-05-09 19:58 最爱五仁月饼 阅读(83) 评论(0) 推荐(0)
摘要:一 . 概述 在之前的Thread类之中有线程挂起和停止等操作,但是这些方法都被废弃了. 在JUC之中,提供了LockSupports类可以完成线程的挂起等操作了. 二 .例子 在这个例子中,我们使用park()方法挂起了当前的线程,因此子线程在打印了线程启动之后就被挂起了. 主线程在3秒之后就重启 阅读全文
posted @ 2018-05-08 22:18 最爱五仁月饼 阅读(111) 评论(0) 推荐(0)
摘要:一 . 概述 该类描述的是一个交换空间,我们可以理解为我们的生产者和消费者模型之中的缓冲区. 二 . 类结构 构造方法: 这个类的构造需要一个泛型,表示需要交换的数据. exchange()交换数据. 当传入null的时候表示从缓冲区中获取数据. 三 . 例子 我们模拟一个生产者和消费者的模型 注意 阅读全文
posted @ 2018-05-08 22:05 最爱五仁月饼 阅读(108) 评论(0) 推荐(0)
摘要:一 . 概述 在之前我们介绍了CountDownLatch和CyclicBarrier两个类. 其中,CountDownLatch是凑足信号量启动一个线程运行,而CyclicBarrier是凑够信号量将原先阻塞的线程全部启动. 现在我们需要介绍一个信号量类 Semaphore. 说到信号量,大家都不 阅读全文
posted @ 2018-05-08 21:46 最爱五仁月饼 阅读(109) 评论(0) 推荐(0)
摘要:一 . 概述 在之前我们说到了CountDownLatch,现在要说的这个CyclicBarrier和CountDownLatch差不多. 我们通过类的结构慢慢分析. 二 . 类的结构 构造函数一: 需要一个int值表示需要参与的线程数量 这个构造函数多了一个Runnable的线程任务,这个构造函数 阅读全文
posted @ 2018-05-08 20:49 最爱五仁月饼 阅读(106) 评论(0) 推荐(0)
摘要:一 .概述 在前面我们时候说到了使用Condition实现线程的精确控制,但是我们在日常使用的时候我们发现我们的并发总是有一些规律. 比如在某些线程完成任务之后,该线程才开始,这样的场景总是并发场景中经常出现的. 为此,JUC提供了并发的辅助类帮助我们简化这种线程并发场景的实现. 二 . Count 阅读全文
posted @ 2018-05-08 20:32 最爱五仁月饼 阅读(181) 评论(0) 推荐(0)
摘要:一 . 概述 在之前我们我们线程之间进行通信使用的是内置锁的wait()方法和notify()实现的,而我们使用了高级锁之后,就可以使用Condition进行条件控制, 通过精确的控制我们能够完成更简单的线程控制. 二 .Condition的使用 下面我们定义三个线程,让他们按照次序进行输出. 我们 阅读全文
posted @ 2018-05-08 19:34 最爱五仁月饼 阅读(125) 评论(0) 推荐(0)
摘要:一 . 概述 在JDK5之前,我们都需要使用synchronized来完成内置锁的实现同步效果,Synchronized的操作力度过大,因而出现了一个替代的产品ReentrantLock(可重入锁). 二 .可重入锁的基本使用 在这里我们还是使用前面的计数操作完成演示. 我们看到可重入锁的使用非常简 阅读全文
posted @ 2018-05-07 23:07 最爱五仁月饼 阅读(124) 评论(0) 推荐(0)
摘要:一 . 概述 在之前我们讨论过线程的高效的提升方式,在JUC之中提供了各种方式来提升并发的效果. 其中大多数的并发容器,并发辅助类,队列等都使用了一个类,这个类就是AQS. 可以这么说AQS完成了JUC的大部分底层实现. 二 .AQS的介绍 AbstractQueuedSynchronizer(抽象 阅读全文
posted @ 2018-05-07 22:36 最爱五仁月饼 阅读(248) 评论(0) 推荐(0)
摘要:一 . 概述 上一节中我们提到了Future对象,是从Callable接口中封装返回接口的对象. 这一节就说一下Future接口. 二 .Future接口 这个接口总的来说就是描述了返回结果的对象,这是一个异步的方式.只有调用了get()方法的时候会发生阻塞现象. 三 总结 在这里我们不去说异步的问 阅读全文
posted @ 2018-05-07 21:59 最爱五仁月饼 阅读(101) 评论(0) 推荐(0)
摘要:一 .概述 在前面,我们创建线程总是需要实现run()方法,无论继承还是实现run()方法. 我们首先看一下run()方法的结构. 我们首先看到的是run()方法没有返回值,没有异常声明. 这也就决定我们使用run()方法会有一点麻烦的地方. [1]返回值我们需要特殊处理 [2]异常的问题有些麻烦, 阅读全文
posted @ 2018-05-07 21:46 最爱五仁月饼 阅读(112) 评论(0) 推荐(0)
摘要:一 . 概述 在前面我们介绍了线程的同步和通信的方式,其根本就是在线程并发的时候更好的保证线程的安全性,可见性,有序性. 总的来说,就是将线程的不可控制的特性尽量降低,在正确和性能之间寻找平衡点. 控制就意味性能的降低,但是我们需要控制来保证安全性. 总的来说,现在就是我们寻找线程的平衡点的一个时机 阅读全文
posted @ 2018-05-07 21:27 最爱五仁月饼 阅读(99) 评论(0) 推荐(0)
摘要:一 . 概述 在前面我们使用各种方式解决了线程的安全性问题,无论是加锁和是使用无锁的方式,本质上讲都是控制线程的执行顺序. 但是前面对线程的控制顺序还只是出于粗粒度的控制,我们常常希望看到的是一个线程完成任务然后激发另外一个线程的线程任务的执行, 或者两个线程交互完成任务(生产者生产一个产品,消费者 阅读全文
posted @ 2018-05-07 20:41 最爱五仁月饼 阅读(95) 评论(0) 推荐(0)
摘要:一 .概述 在之前我们讨论过线程安全性的问题,我们通过加锁或者使用无锁来保证线程安全. 当然无锁的性能会变得更好.但是他们的实质的核心都是保证对访问的资源的原子性. 那我们回忆一下线程安全性问题的发生的条件: [1]多线程并发 [2]共享资源 [3]对共享资源的非原子性操作 我们如果将共享资源打破掉 阅读全文
posted @ 2018-05-07 20:16 最爱五仁月饼 阅读(224) 评论(0) 推荐(0)
摘要:一 . 概述 我们知道加锁会对多线程的并发有影响,那么我们是否有无锁的方式保证线程的安全性呢?有的,就是CAS方式. CAS的核心就是乐观的尝试,将线程的阻塞变成了线程的尝试,认为即使在不断尝试的代价也比阻塞后唤醒的代价要小. 二 CAS CAS到底是什么呢? 其实就是一个JVM的指令,其中这个指令 阅读全文
posted @ 2018-05-05 23:35 最爱五仁月饼 阅读(131) 评论(0) 推荐(0)
摘要:一 .概述 在我们之前的计数程序之中,我们知道只要保证count++是一个原子性的操作就能保证程序的线程安全性. 当然这种常用的功能在jdk5中就出现了,这就是原子类. 原子类都是JUC包下atomic之中,类的数量比较多. 二 . 原子类的介绍 原子类的操作之中可以保证是线程安全的,当我们的应用之 阅读全文
posted @ 2018-05-05 23:19 最爱五仁月饼 阅读(98) 评论(0) 推荐(0)
摘要:一 . 概述 可见性问题: 什么是可见性问题?可见性问题的原因是什么? 可见性问题完全是JVM的结构造成的,JVM为了高速的运行,对每一个线程进行了线程栈的设计,在线程栈之中设置了高速的缓存. 缓存之中存在共享变量的副本,在有些时候,因为来不及维护副本和实体的一致性可能造成问题,这种问题就是可见性问 阅读全文
posted @ 2018-05-05 21:49 最爱五仁月饼 阅读(161) 评论(0) 推荐(0)
摘要:一 .概述 在synchronized之中可能有一个悖论,就是获得锁的线程调用两个互相调用的加锁方法会出现什么情况,如果处置不当,那么就会发生死锁. 但是幸运的是,synchronized是可以重入的. 二 .例子 运行结果并没有发生我们可能会认为的死锁问题,也就说明了synchronized是可以 阅读全文
posted @ 2018-05-05 21:26 最爱五仁月饼 阅读(122) 评论(0) 推荐(0)