
Java多线程与并发
并发编程的方方面面
圣斗士Morty
Java开发者,技术学习爱好者,费曼技巧学习法践行者
-
原创 Java并发编程实战————Executor框架与任务执行
引言 本篇博客介绍通过“执行任务”的机制来设计应用程序时需要掌握的一些知识。所有的内容均提炼自《Java并发编程实战》中第六章的内容。 大多数并发应用程序都是围绕“任务执行”来构造的:任务通常是一些抽象的且离散的工作单元。 当围绕“任务执行”来设计应用程序结构时,第一步,就是要找出清晰的任务边界。在理想情况下,各个任务之间是相互独立的:任务并不依赖于其他任务的状态、结果或边界效应。 大多数...2019-02-15 16:59:34393
0
-
原创 Java并发编程实战————常用并发容器介绍
引言 本博客基于常用的并发容器,简单概括其基本特性和简单使用,并不涉及较深层次的原理分析和全面的场景用法。 适合对不了解并发容器的同学,工作中遇到类似的场景,能够对文中提到的并发容器留有简单印象就好。 一、ConcurrentHashMap 下面的程序中,切换任意Map的实现方式,如TreeMap、HashTable、ConcurrentHashMap等,运行程序,观察执行结果: pu...2018-11-30 21:41:42367
0
-
原创 Java并发编程实战————并发技巧小结
可变状态是至关重要的。所有的并发问题都可以归结为如何协调对并发状态的访问。可变状态越少,就越容易确保线程安全性。 尽量将域声明为final类型,除非需要它们是可变的。 不可变对象一定是线程安全的。不可变对象能极大地降低并发编程的复杂性。它们更为简单而且安全,可以任意共享而无须使用加锁或保护性复制等机制。 封装有助于管理复杂性。在编写线程安全的程序时,虽然可以将所有数据都保存在全局变量中,但为...2018-11-27 22:10:47137
0
-
原创 Java并发编程实战————Semaphore信号量的使用浅析
引言 本篇博客讲解《Java并发编程实战》中的同步工具类:信号量 的使用和理解。 从概念、含义入手,突出重点,配以代码实例及讲解,并以生活中的案例做类比加强记忆。 什么是信号量 Java中的同步工具类信号量即计数信号量(Counting Semaphore),是用来控制访问某个特定资源的操作数量,或同时执行某个指定操作的数量。可以简单理解为信号量用来限制对某个资源的某种操作的数量。 一...2018-11-19 23:49:12222
0
-
原创 Java并发编程实战————对象的组合
引言 对象的组合,是《Java Concurrency in Practice》中第四章引入的课题。这并不是一个并发的概念。 为了可以将现有的线程安全组件组合为更大规模的组件或程序,而不是每次内存访问都进行分析以确保程序是线程安全的。这一章将介绍一些组合模式,这些模式可以更容易的使一个类成为线程安全的类,并且维护性更强。 一、设计线程安全的类 为了在不对整个程序进行分析的情况下就可以得出一...2018-10-08 21:35:04160
0
-
原创 Java并发编程实战————售票问题
引言 现有一个需求如下: 有10000张火车票,每张票都有一个编号,同时有10个窗口对外售票,如何确保车票的正常售卖? 程序一:使用List 问题的解决办法都是从我们最最熟悉的角度思考。程序一,我们使用一个普通的List作为方案。 阅读以下代码,观察执行结果: public class TicketSell_01 { static List<String> tic...2018-10-06 18:21:131934
0
-
原创 Java并发编程实战————ThreadLocal
一、引言 ThreadLocal是Java帮助实现线程封闭性的典型手段。 作用:提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量的传递复杂度。同时也用来维护线程中的变量不被其他线程干扰。 这个类能使线程中的某个值与保存值的对象关联起来。ThreadLocal提供了get 与set方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因...2018-10-06 11:02:50303
1
-
原创 Java并发编程实战————Condition
引言 使用Condition实现生产者-消费者模型,并与wait和notify实现的效果相对比。 wait/notify模拟生产者-消费者 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法能够支持2个生产线程以及10个消费者线程的阻塞调用。 在《Effective Java》一书中提到:wait()方法()绝大多数情况下都是和while一起使用的。这是因为,...2018-10-04 21:31:38154
0
-
原创 Java并发编程实战————Lock
可替代synchronized的手动锁 ReentrantLock是Lock接口的一个实现,可以用于替代synchronized。 使用ReentrantLock可以完成类似synchronized(this)的功能,需要注意的是,就算线程已经执行完毕,Lock也不会自动释放锁,必须要手动释放锁!!! 与synchronized不同的是:使用synchronized锁定的话如果遇到异常,J...2018-09-15 22:57:37328
0
-
原创 Java并发编程实战————wait、notify、CountDownLatch
引言 前面的学习中已经解除了关于加锁,共享变量可见性,原子性,synchronized,volatile等知识。在多线程中,还有很多需要掌握的小知识点。 避免字符串常量作为锁对象 在下面的例子中,m1和m2其实锁定的是同一个对象这种情况下还会发生比较诡异的现象,比如你用到一个类库,在该类库中代码锁定了字符串"Hello",但是你读不到源码,所以你在自己的代码中也锁定了"Hello",这时候就...2018-09-02 16:17:06911
0
-
原创 Java并发编程实战————volatile
volatile? volatile是保证共享变量变化可见性的关键字。所谓可见性,就是一个变量在多个线程间可见,而volatile保证了共享变量的改变在多线程之间能够及时的发现。 示例 代码 public class T { /*volatile*/ boolean running = true;// 对比一下有无volatile的情况下,整个程序运行结果的区别 voi...2018-08-29 07:11:12337
0
-
原创 Java并发编程实战————可重入内置锁
引言 在《Java Concurrency in Practice》的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块。“重入”意味着获取锁的操作的粒度是“线程”,而不是调用。当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会阻塞。然而,由于内置锁时可重入的,因此如果某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功。————《Java...2018-06-20 23:16:24348
0
-
原创 Java并发编程实战————synchronized
锁代码还是锁对象? 很多使用synchronized关键字的同学很容易混淆这个概念。我们很常见到用synchronized 修饰一个方法,那么究竟synchronized锁定的是方法,还是对象呢? 答案是:synchronized锁定的是对象!是堆中实际的对象,并不是栈中的引用。 锁对象? 想要证明是锁对象其实非常简单,下面这个demo可以看出synchronized锁定的是同一个共享对象...2018-08-27 23:11:39159
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:20146
0
-
原创 Java定时器
宁波box箱体项目中需要软件能够每天定时开关投影机并播放片子,其中最关键的实现是定时器的逻辑,在网上找了找,终于找到一篇能够对我有帮助的定时器写法。在项目中我封装成了一个特定的方法,只需要传入特定的时分和操作类型就可以达到定时执行指定操作的功能。 /** * 根据指定时-分控制所有设备 * @author mht * @param hour * @pa...2017-11-10 14:45:12190
0
-
原创 Java并发编程实战————恢复中断
中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他操作。 什么是中断状态? 线程类有一个描述自身是否被中断了的boolean类型的状态,可以通过调用 .isInterrupted() 方法来查看。官方解释如下: 简单来说,这个方法如果返回 true ,那么表示线程已经被中断。 恢复中断 这里提到的 “恢复中断” 绝对不是 “从中断中恢复” 的意思! 在《Ja...2019-02-23 11:04:00778
5