[Java并发-26] 软件事务内存:借鉴数据库的并发经验

2019-07-19
阅读 5 分钟
2.9k
实际上我们天天都在写并发程序,只不过并发相关的问题都被类似 Tomcat 这样的 Web 服务器以及 MySQL 这样的数据库解决了。尤其是数据库,在解决并发问题方面,可谓博大精深,它的事务机制非常简单易用,能甩 Java 里面的锁、原子类十条街。很显然对于我们要借鉴一下。

[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率

2019-07-15
阅读 4 分钟
4.8k
生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式。

[Java并发-21-并发设计模式] Balking模式:线程安全的单例模式

2019-07-12
阅读 3 分钟
1.4k
上一篇文章中,我们提到可以用“多线程版本的 if”来理解 Guarded Suspension 模式,不同于单线程中的 if,这个“多线程版本的 if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。

[Java并发-20-并发设计模式] Guarded Suspension模式:等待唤醒机制的规范实现

2019-07-09
阅读 5 分钟
1.9k
在开发中我们或许回遇到这样的情况:有一个Web 版的文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持消息队列(MQ)方式接入。消息队列在互联网大厂中用的非常多,主要用作流量削峰和系统解耦。在这种接入方式中,发送消息和消费结果...

[Java并发-19-并发设计模式] ThreadLocal | 线程本地存储模式

2019-07-09
阅读 5 分钟
2.9k
我们曾经重复说到,多个线程同时读写同一共享变量存在并发问题。前面两篇文章我们突破的是写,没有写操作自然没有并发问题了。其实还可以突破共享变量,没有共享变量也不会有并发问题。

[Java并发-18-并发设计模式] COW模式:Copy-on-Write模式的应用领域

2019-07-04
阅读 3 分钟
2.3k
在上一篇文章中我们讲到 Java 里 String 这个类在实现 replace() 方法的时候,并没有更改原字符串里面 value[] 数组的内容,而是创建了一个新字符串,这种方法在解决不可变对象的修改问题时经常用到。如果你深入地思考这个方法,你会发现它本质上是一种Copy-on-Write 方法。所谓 Copy-on-Write,经常被缩写为 COW 或者 C...

[Java并发-17-并发设计模式] Immutability模式:如何利用不变性解决并发问题?

2019-07-04
阅读 4 分钟
1.5k
解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操...

[Java并发-16] CompletionService:批量执行异步任务

2019-06-27
阅读 4 分钟
7.5k
上面的这个方案本身没有太大问题,但是有个地方的处理需要你注意,那就是如果获取电商 S1 报价的耗时很长,那么即便获取电商 S2 报价的耗时很短,也无法让保存 S2 报价的操作先执行,因为这个主线程都阻塞在了 f1.get(),那我们如何解决了?

[Java并发-14] Future: 优雅的使用多线程

2019-06-23
阅读 5 分钟
11.1k
上一篇,我们详细介绍了如何创建正确的线程池,那创建完线程池,我们该如何使用呢?在上一篇文章中,我们仅仅介绍了 ThreadPoolExecutor 的 void execute(Runnable command) 利用这个方法虽然可以提交任务,但是却没有办法获取任务的执行结果(execute() 方法没有返回值)。而很多场景下,我们又都是需要获取任务的执行...

[Java并发-12] 原子类:无锁工具类的典范

2019-06-16
阅读 6 分钟
1.9k
前面我们多次提到一个累加器的例子,示例代码如下。在这个例子中,add10K() 这个方法不是线程安全的,问题就出在变量 count 的可见性和 count+=1 的原子性上。可见性问题可以用 volatile 来解决,而原子性问题我们前面一直都是采用的互斥锁方案。

java单例模式几种实现方式分析

2019-04-10
阅读 2 分钟
1.2k
这种方法可以实现延时加载,但是有一个致命弱点:线程不安全(可见性,有序性)。如果有两条线程同时调用getSingleton()方法,就有很大可能导致重复创建对象。

[Java并发-3]Java互斥锁,解决原子性问题

2019-04-10
阅读 7 分钟
2.8k
在前面的分享中我们提到。 一个或者多个操作在 CPU 执行的过程中不被中断的特性,称为“原子性” 思考:在32位的机器上对long型变量进行加减操作存在并发问题,什么原因!? 原子性问题如何解决 我们已经知道原子性问题是线程切换,而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。 在...

[Java并发-2]Java如何解决可见性问题的

2019-03-18
阅读 4 分钟
3k
之前我们说了:1,可见性2,原子性3,有序性3个并发BUG的之源,这三个也是编程领域的共性问题。Java诞生之处就支持多线程,所以自然有解决这些问题的办法,而且在编程语言领域处于领先地位。理解Java解决并发问题的方案,对于其他语言的解决方案也有触类旁通的效果。

[Java并发-1]入门:并发编程Bug的源头

2019-03-18
阅读 3 分钟
1.8k
背景介绍 如何解决并发问题,首先要理解并发问题的实际源头怎么发生的。 现代计算机的不同硬件的运行速度是差异很大的,这个大家应该都是知道的。 计算机数据传输运行速度上的快慢比较: CPU > 缓存 > I/O 如何最大化的让不同速度的硬件可以更好的协调执行,需要做一些“撮合”的工作 CUP增加了高速缓存来均衡与缓存...