并发
Johnson木木
这个作者很懒,什么都没留下…
展开
-
执行ArrayList的remove(object)方法抛异常?
简介或许有很多小伙伴尝试过如下的代码ArrayList<Object> list = ...;for (Object object : list) { if (条件成立) { list.remove(object); }}然后会发现抛出java.util.ConcurrentModificationException异常。那么这个到底是什么情况?for(元素 : 集合)...原创 2020-07-09 15:01:16 · 353 阅读 · 2 评论 -
Java并发编程实战总结 (一)
前提首先该场景是一个酒店开房的业务。暂时只包含开房账单和房间排期两个功能,开房时会添加一条账单,而房间排期主要是为了房间使用的时间不冲突。如:账单A,使用房间1,使用时间段为2020-06-01 12:00 - 2020-06-02 12:00 ,那么还需要使用房间1开房的时间段则不能与账单A的时间段冲突。业务类为了简单起见,我把两个类都简化了。账单类public class Bill { // 账单号 private String serial; // 房间排期id原创 2020-06-03 11:07:02 · 291 阅读 · 1 评论 -
Java并发编程实战 05等待-通知机制和活跃性问题
Java并发编程系列Java并发编程实战 01并发编程的Bug源头Java并发编程实战 02Java如何解决可见性和有序性问题Java并发编程实战 03互斥锁 解决原子性问题Java并发编程实战 04死锁了怎么办前提在Java并发编程实战 04死锁了怎么办中,我们讲到了使用一次性申请所有资源来避免死锁的发生,代码如下:/** 锁分配器(单例类) */public class LockAllocator { private final List<Object> lock =原创 2020-05-20 09:21:59 · 393 阅读 · 0 评论 -
Java并发编程实战 04死锁了怎么办?
摘要在第三篇文章最后的例子当中,需要锁定两个账户才能进行转账操作,这种情况很有可能会发生死锁,我把上一章的代码片段放到下面:public class Account { // 余额 private Long money; public synchronized void transfer(Account target, Long money) { synchronized(this) { (1) synchronized原创 2020-05-12 08:07:54 · 389 阅读 · 0 评论 -
Java并发编程实战 03互斥锁 解决原子性问题
文章系列Java并发编程实战 01并发编程的Bug源头Java并发编程实战 02Java如何解决可见性和有序性问题摘要在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和有序性的问题,那么还有一个原子性问题咱们还没解决。在第一篇文章01并发编程的Bug源头当中,讲到了把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性,那么原子性的问题该如何解决。同一...原创 2020-05-07 08:18:30 · 1043 阅读 · 1 评论 -
Java并发编程实战 02Java如何解决可见性和有序性问题
摘要在上一篇文章当中,讲到了CPU缓存导致可见性、线程切换导致了原子性、编译优化导致了有序性问题。那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经常考核到)什么是Java内存模型?现在知道了CPU缓存导致可见性、编译优化导致了有序性问题,那么最简单的方式就是直接禁用CPU缓存和编译优化。但是这样做我们的性能可就要爆炸了~。我们应该按需禁用。...原创 2020-04-20 10:09:27 · 1729 阅读 · 4 评论 -
Java并发编程实战 01并发编程的Bug源头
摘要本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章并发Bug源头并发编程的Bug源头主要为可见性、有序性、原子性源头之一:CPU缓存导致的可见性问题一个线程对共享变量的修改,另外一个线程能够立即看到,那么就称为可见性。现在多核CPU时代中,每颗CPU都有自己的缓存,CPU之间并不会共享缓存;如线程A从内存读取变量V到CPU-1的缓存中,线程B也从内存...原创 2020-04-14 13:58:14 · 434 阅读 · 0 评论