Java多线程与并发
文章平均质量分 92
并发编程的方方面面
圣斗士Morty
Java开发者,技术学习爱好者,费曼技巧学习法践行者
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Queue —— JUC 的豪华队列组件
目录引言一、Queue 的类结构1.1 Queue 定义基础操作1.2 AbstractQueue 为子类减负1.3 BlockingQueue 阻塞式Queue1.4 Deque 两头进出二、Queue 的重要实现三、Queue 在线程池中的应用四、ConcurrentLinkedQueue总结引言Queue 是Collection 接口下的另一个重要接口。常常作为生产者/消费者模式、线程池任务队列等基础组件的形式存在。JUC中提供了丰富的Queue组件,如 ArrayBlockingQueue、原创 2021-06-26 16:01:37 · 772 阅读 · 1 评论 -
Java 写时复制容器 —— CopyOnWriteArrayList
引言原创 2021-06-17 21:05:42 · 930 阅读 · 1 评论 -
Java 多线程 —— AQS 详解
引言原创 2021-06-13 15:39:03 · 3221 阅读 · 3 评论 -
Java中的Unsafe
Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数是private的:...转载 2021-06-06 09:05:09 · 529 阅读 · 1 评论 -
Java多线程 —— 线程的生命周期与状态迁移
线程状态迁移是非常重要的多线程基础知识,在调试多线程问题的时候,能够发挥很大的作用。6 种状态不仅要熟记,而且在什么情况下会出现这些状态也要清晰明了。如果条件允许,可以试着通过不同的方法来模拟线程的六种状态的切换,可以加深对线程生命周期的理解。原创 2021-05-31 23:23:10 · 755 阅读 · 3 评论 -
Java并发编程实战————Executor框架与任务执行
引言本篇博客介绍通过“执行任务”的机制来设计应用程序时需要掌握的一些知识。所有的内容均提炼自《Java并发编程实战》中第六章的内容。大多数并发应用程序都是围绕“任务执行”来构造的:任务通常是一些抽象的且离散的工作单元。当围绕“任务执行”来设计应用程序结构时,第一步,就是要找出清晰的任务边界。在理想情况下,各个任务之间是相互独立的:任务并不依赖于其他任务的状态、结果或边界效应。大多数...原创 2019-02-15 16:59:34 · 930 阅读 · 0 评论 -
Java 多线程 —— 常用并发容器
引言本博客基于常用的并发容器,简单概括其基本特性和简单使用,并不涉及较深层次的原理分析和全面的场景用法。适合对不了解并发容器的同学,工作中遇到类似的场景,能够对文中提到的并发容器留有简单印象就好。一、ConcurrentHashMap下面的程序中,切换任意Map的实现方式,如TreeMap、HashTable、ConcurrentHashMap等,运行程序,观察执行结果:pu...原创 2018-11-30 21:41:42 · 863 阅读 · 0 评论 -
Java并发编程实战————并发技巧小结
可变状态是至关重要的。所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。 尽量将域声明为final类型,除非需要它们是可变的。 不可变对象一定是线程安全的。不可变对象能极大地降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制。 封装有助于管理复杂性。在编写线程安全的程序时,虽然可以将所有数据都保存在全局变量中,但为...原创 2018-11-27 22:10:47 · 458 阅读 · 0 评论 -
Java并发编程实战————Semaphore信号量的使用浅析
引言本篇博客讲解《Java并发编程实战》中的同步工具类:信号量 的使用和理解。从概念、含义入手,突出重点,配以代码实例及讲解,并以生活中的案例做类比加强记忆。什么是信号量Java中的同步工具类信号量即计数信号量(Counting Semaphore),是用来控制访问某个特定资源的操作数量,或同时执行某个指定操作的数量。可以简单理解为信号量用来限制对某个资源的某种操作的数量。一...原创 2018-11-19 23:49:12 · 622 阅读 · 0 评论 -
Java并发编程实战————对象的组合
引言对象的组合,是《Java Concurrency in Practice》中第四章引入的课题。这并不是一个并发的概念。为了可以将现有的线程安全组件组合为更大规模的组件或程序,而不是每次内存访问都进行分析以确保程序是线程安全的。这一章将介绍一些组合模式,这些模式可以更容易的使一个类成为线程安全的类,并且维护性更强。一、设计线程安全的类为了在不对整个程序进行分析的情况下就可以得出一...原创 2018-10-08 21:35:04 · 532 阅读 · 0 评论 -
Java并发编程实战————售票问题
引言现有一个需求如下:有10000张火车票,每张票都有一个编号,同时有10个窗口对外售票,如何确保车票的正常售卖?程序一:使用List问题的解决办法都是从我们最最熟悉的角度思考。程序一,我们使用一个普通的List作为方案。阅读以下代码,观察执行结果:public class TicketSell_01 { static List<String> tic...原创 2018-10-06 18:21:13 · 2734 阅读 · 0 评论 -
Java 多线程 —— ThreadLocal
一、引言ThreadLocal是Java帮助实现线程封闭性的典型手段。作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度。同时也用来维护线程中的变量不被其他线程干扰。这个类能使线程中的某个值与保存值的对象关联起来。ThreadLocal提供了get 与set方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因...原创 2018-10-06 11:02:50 · 757 阅读 · 1 评论 -
Java 多线程 —— AQS 原理
引言使用Condition实现生产者-消费者模型,并与wait和notify实现的效果相对比。wait/notify模拟生产者-消费者面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法能够支持2个生产线程以及10个消费者线程的阻塞调用。在《Effective Java》一书中提到:wait()方法()绝大多数情况下都是和while一起使用的。这是因为,...原创 2018-10-04 21:31:38 · 475 阅读 · 0 评论 -
Java 多线程 —— ReentrantLock 与 Condition
可替代synchronized的手动锁ReentrantLock是Lock接口的一个实现,可以用于替代synchronized。使用ReentrantLock可以完成类似synchronized(this)的功能,需要注意的是,就算线程已经执行完毕,Lock也不会自动释放锁,必须要手动释放锁!!!与synchronized不同的是:使用synchronized锁定的话如果遇到异常,J...原创 2018-09-15 22:57:37 · 774 阅读 · 0 评论 -
Java 多线程 —— wait 与 notify
引言前面的学习中已经解除了关于加锁,共享变量可见性,原子性,synchronized,volatile等知识。在多线程中,还有很多需要掌握的小知识点。避免字符串常量作为锁对象在下面的例子中,m1和m2其实锁定的是同一个对象这种情况下还会发生比较诡异的现象,比如你用到一个类库,在该类库中代码锁定了字符串"Hello",但是你读不到源码,所以你在自己的代码中也锁定了"Hello",这时候就...原创 2018-09-02 16:17:06 · 1434 阅读 · 0 评论 -
Java并发编程实战——volatile
volatile?volatile是保证共享变量变化可见性的关键字。所谓可见性,就是一个变量在多个线程间可见,而volatile保证了共享变量的改变在多线程之间能够及时的发现。示例代码public class T { /*volatile*/ boolean running = true;// 对比一下有无volatile的情况下,整个程序运行结果的区别 voi...原创 2018-08-29 07:11:12 · 858 阅读 · 0 评论 -
Java并发编程实战————可重入内置锁
引言在《Java Concurrency in Practice》的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块。“重入”意味着获取锁的操作的粒度是“线程”,而不是调用。当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁时可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。————《Java...原创 2018-06-20 23:16:24 · 836 阅读 · 0 评论 -
Java内置锁——synchronized
锁代码还是锁对象?很多使用synchronized关键字的同学很容易混淆这个概念。我们很常见到用synchronized 修饰一个方法,那么究竟synchronized锁定的是方法,还是对象呢?答案是:synchronized锁定的是对象!是堆中实际的对象,并不是栈中的引用。锁对象?想要证明是锁对象其实非常简单,下面这个demo可以看出synchronized锁定的是同一个共享对象...原创 2018-08-27 23:11:39 · 503 阅读 · 0 评论 -
Java 多线程 —— 死锁与锁的错误用法
概述死锁状态的大体思路是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图:代码描述public class DeadLockDemo { static class A { public synchronized void saying() { ...原创 2018-08-26 12:17:20 · 535 阅读 · 0 评论 -
Java定时器
宁波box箱体项目中需要软件能够每天定时开关投影机并播放片子,其中最关键的实现是定时器的逻辑,在网上找了找,终于找到一篇能够对我有帮助的定时器写法。在项目中我封装成了一个特定的方法,只需要传入特定的时分和操作类型就可以达到定时执行指定操作的功能。 /** * 根据指定时-分控制所有设备 * @author mht * @param hour * @pa...原创 2017-11-10 14:45:12 · 369 阅读 · 0 评论 -
Java并发编程实战————恢复中断
中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他操作。什么是中断状态?线程类有一个描述自身是否被中断了的boolean类型的状态,可以通过调用 .isInterrupted() 方法来查看。官方解释如下:简单来说,这个方法如果返回 true ,那么表示线程已经被中断。恢复中断这里提到的 “恢复中断” 绝对不是 “从中断中恢复” 的意思!在《Ja...原创 2019-02-23 11:04:00 · 2178 阅读 · 6 评论
分享