随笔分类 -  多线程

1
摘要:本文是对geektime专栏Java并发编程实战的整理笔记。 一、并发编程的理论基础 1.出现可见性、原子性和有序性问题的原因? CPU、内存、IO之间速度存在巨大差异。 为了平衡三者间的速度差异,OS、CPU、编译系统进行了优化。 1. CPU: 增加了缓存,以均衡与内存的速度差异; 2. OS: 阅读全文
posted @ 2019-09-26 23:55 静水楼台/Java部落阁 阅读(347) 评论(0) 推荐(0) 编辑
摘要:1.Thread的默认异常处理 线程不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。我们可以查看一下Thread类的run()方法声明,方法声明上没有对抛出异 阅读全文
posted @ 2019-06-17 17:12 静水楼台/Java部落阁 阅读(10108) 评论(2) 推荐(3) 编辑
摘要:大多数情况下,任务运行完后会自动结束。然而,有时我们希望提前结束任务或线程,可能是因为用户取消了操作,或者应用程序需要被快速关闭。但是,Java并没有提供任务机制来安全地终止线程,但Java提供了线程中断,中断是一种协作机制,能使一个线程终止另一个线程的当前工作。 通常,我们不希望某个任务、线程或服 阅读全文
posted @ 2019-05-12 15:58 静水楼台/Java部落阁 阅读(6557) 评论(2) 推荐(2) 编辑
摘要:一、线程的状态 1.Java中的6种线程状态 Java语言定义了6种线程状态 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 新建(New) 线程创建后尚未启动。 可运行(Runnab 阅读全文
posted @ 2019-05-02 20:02 静水楼台/Java部落阁 阅读(1953) 评论(0) 推荐(1) 编辑
摘要:官方文档: @EnableAsync The @Async annotation 官方案例:https://spring.io/guides/gs/async-method 一、在spring中使用异步处理 1.@EnableAsync和@Async 首先,在配置类加上@EnableAsync来启用 阅读全文
posted @ 2019-04-11 19:46 静水楼台/Java部落阁 阅读(229) 评论(0) 推荐(0) 编辑
摘要:ArrayBlockingQueue是一个基于数组实现的有界的阻塞队列。 属性 //底层存储元素的数组。为final说明一旦初始化,容量不可变,所以是有界的。 final Object[] items; //下一个take, poll, peek or remove操作的index位置 int ta 阅读全文
posted @ 2019-01-19 15:38 静水楼台/Java部落阁 阅读(449) 评论(0) 推荐(0) 编辑
摘要:AbstractQueuedSynchronizer,简称为AQS,它是构建JDK中多个并发工具的基础。下图展示了JDK中使用AQS构建的并发工具。 可见,AQS在Java并发编程中是多么的重要。所以,我们有必要搞清楚其实现的原理。 一、AQS中的数据结构 在AQS类文件的注释中,作者已经给出了内部 阅读全文
posted @ 2019-01-03 15:14 静水楼台/Java部落阁 阅读(238) 评论(0) 推荐(0) 编辑
摘要:内置锁是jvm内部支持的,使用时不需要显示的加锁和释放锁,因此内置锁也被称为隐式锁。而重入锁使用时需要显式的加锁和释放锁,因此属于显式锁。 一、重入锁概述 重入锁是JDK1.5引入的,作为一种线程同步机制,其作用与内置锁相同,但并不是用来替代内置锁的。但它提供了一些内置锁不具备的特性。在java中使 阅读全文
posted @ 2018-12-12 18:27 静水楼台/Java部落阁 阅读(288) 评论(0) 推荐(0) 编辑
摘要:属性 重入锁是基于AQS实现的,它提供了公平锁和非公平锁两个版本的实现。 非公平锁和公平锁两个类都是内部类,而ReentrantLock中只引入Sync类型的sync,面向接口编程。实际使用哪个版本则由构造器决定,默认使用非公平锁,也可以在构造时手动指定。 构造器 加锁(非公平版)-lock 因为默 阅读全文
posted @ 2018-11-05 19:21 静水楼台/Java部落阁 阅读(208) 评论(0) 推荐(0) 编辑
摘要:一、final的基本语义 final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量) 当用final修饰一个类时,表明这个类不能被继承。 当用final修饰一个方法时,表明这个方法不能被重写。 当用final修饰一个变量时,表明这个变量初始化后就不能再被修改。 对于final类,从设计的角 阅读全文
posted @ 2018-08-19 23:28 静水楼台/Java部落阁 阅读(624) 评论(0) 推荐(0) 编辑
摘要:一、概述 ThreadLocal应用场景很广,很多主流框架都使用到它。例如,Spring用它来管理数据库连接,每个线程获取的都是自己的数据库连接对象。 通常,我们使用ThreadLocal有两个目的: 1.用来隔离不同线程的变量,避免线程间互相干扰。 比如,我们系统每秒钟同时会有很多用户请求,每个请 阅读全文
posted @ 2018-05-29 17:41 静水楼台/Java部落阁 阅读(169) 评论(0) 推荐(0) 编辑
摘要:Java编程思想中有这样一句话: 当我们使用线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干扰到另外一个任务,这解决的是线程间彼此干涉的问题,现在我们需要来解决线程间彼此协调的问题,也就是线程间通信问题。 其实我一直对线程间通信这个概念比较模糊,如果仅仅从 阅读全文
posted @ 2018-05-29 17:40 静水楼台/Java部落阁 阅读(3337) 评论(0) 推荐(0) 编辑
摘要:一、锁升级(JMV层优化) JavaSE6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以JavaSe6中锁共有4种状态,级别从低到高依次是:无锁状态,偏向锁状态,轻量级锁状态,和重量级锁状态。锁的状态会随着锁竞争的激烈程度的升级而升级。锁可以升级,但不能降级,这种只能升级 阅读全文
posted @ 2018-05-29 17:23 静水楼台/Java部落阁 阅读(378) 评论(0) 推荐(0) 编辑
摘要:从应用程序的角度来看,线程安全问题的产生是由于多线程应用程序缺乏某种保障——线程同步机制。从广义上来说,Java平台提供的线程同步机制包括锁、volatile关键字、final关键字、static关键字以及一些相关的API,如Object.wait()/Object.nofity()等。 一、锁的概 阅读全文
posted @ 2018-05-14 15:07 静水楼台/Java部落阁 阅读(982) 评论(0) 推荐(0) 编辑
摘要:FutureTask官方文档 java中可以通过继承Thread或者实现Runnable接口来实现多线程,但是这种方式并不能让我们在线程执行完后获取执行结果。因此在java1.5开始引入了Callable和Future接口,通过它们可以在线程执行完后获取执行结果。Callable表示一个可返回结果的 阅读全文
posted @ 2017-11-21 18:53 静水楼台/Java部落阁 阅读(435) 评论(0) 推荐(0) 编辑
摘要:一、死锁 死锁造成的影响很少会立即显现出来。如果一个类可能发生死锁,那么并不意味着每次都会发生死锁,而只是表示有可能,当死锁出现时,往往是在最糟糕的时候——高负载情况下。 1.死锁的四个必要条件 发生死锁,有四个必要条件: 互斥,共享资源 X 和 Y 只能被一个线程占用; 占有且等待,线程 T1 已 阅读全文
posted @ 2017-11-20 23:41 静水楼台/Java部落阁 阅读(751) 评论(0) 推荐(0) 编辑
摘要:一、CAS的原理: CAS中包含了3个操作数——需要读写的内存位置V(内存位置),进行比较的值A(预期值)和拟写入的新值B(新值)。当且仅当V=A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。并且,无论执行修改与否,都将返回V原有值。且仅且只有一个线程能更新变量的值,而其它线 阅读全文
posted @ 2017-06-26 20:41 静水楼台/Java部落阁 阅读(220) 评论(0) 推荐(0) 编辑
摘要:Semaphore官方文档 一、使用信号量实现线程间的通信 /** * Demo:使用信号量实现线程间通信*/ public class SemaphoreDemo { public static void main(String[] args) { // 线程池。信号量通常都是针对多个线程,直接使 阅读全文
posted @ 2017-06-21 12:34 静水楼台/Java部落阁 阅读(163) 评论(0) 推荐(0) 编辑
摘要:CyclicBarrier官方文档 一、原理 CyclicBarrier是另外一种多线程并发控制实用工具。它和CountDownLatch非常类似,它也可以实现线程的计数等待,但它的功能比CountDownLatch更加复杂且强大。 CyclicBarrier可以理解为循环栅栏。栅栏就是一种障碍物, 阅读全文
posted @ 2017-06-21 12:33 静水楼台/Java部落阁 阅读(221) 评论(0) 推荐(0) 编辑
摘要:CountDownLatch官方文档 一、原理 CountDownLatch是一个非常实用的多线程控制工具类。Count Down在英文中意为倒计时,Latch意为门闩,可以简单的将CountDownLatch称为倒计时器。门闩的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线 阅读全文
posted @ 2017-06-21 12:04 静水楼台/Java部落阁 阅读(592) 评论(0) 推荐(0) 编辑

1