随笔分类 -  java并发

摘要:本篇是《ThreadLocal 那点事儿》的续集,如果您没看上一篇,就就有点亏了。如果您错过了这一篇,那亏得就更大了。 还是保持我一贯的 Style,用一个 Demo 来说话吧。用户提出一个需求:当修改产品价格的时候,需要记录操作日志,什么时候做了什么事情。 想必这个案例,只要是做过应用系统的小伙伴 阅读全文
posted @ 2019-08-13 14:27 twoheads 阅读(1150) 评论(0) 推荐(0) 编辑
摘要:为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。 内置锁的分配和膨胀过程较为复杂,限于时间和精力,文中该部分内容是根据网上的多方资料整合而来;仅为方便查阅,后面继续 阅读全文
posted @ 2019-07-11 00:53 twoheads 阅读(1663) 评论(0) 推荐(0) 编辑
摘要:volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于v 阅读全文
posted @ 2019-04-16 18:15 twoheads 阅读(256) 评论(0) 推荐(0) 编辑
摘要:然后,说说精华的部分。 Cmap 支持并发扩容,实现方式是,将表拆分,让每个线程处理自己的区间。如下图: 假设总长度是 64 ,每个线程可以分到 16 个桶,各自处理,不会互相影响。 而每个线程在处理自己桶中的数据的时候,是下图这样的: 扩容前的状态。 当对 4 号桶或者 10 号桶进行转移的时候, 阅读全文
posted @ 2019-04-15 18:54 twoheads 阅读(1772) 评论(0) 推荐(0) 编辑
摘要:我之前书上看到的说法是:Vector是相对线程安全,CopyOnWriteArrayList是绝对线程安全 这种说法其实有些问题,CopyOnWriteArrayList在某些场景下还是会报错的 CopyOnWriteArrayList解决了:1.多线程一边读一边写。2.多线程迭代时修改抛出并发修改 阅读全文
posted @ 2019-04-11 10:45 twoheads 阅读(2687) 评论(1) 推荐(1) 编辑
摘要:wait()作用:该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。条件:在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。进入wait()方法后,当前线程释放锁。在从wait()返回前,线程与其他线程竞争重新获得锁。如果调用wait 阅读全文
posted @ 2019-04-09 18:14 twoheads 阅读(2005) 评论(0) 推荐(0) 编辑
摘要:转自:https://www.aimoon.site/blog/2018/05/21/biased-locking/ 比较复杂,简略见另一篇:https://www.cnblogs.com/twoheads/p/10148598.html JVM中的java对象头 注意:在没有特殊说明的情况下,都是 阅读全文
posted @ 2018-12-20 16:14 twoheads 阅读(7144) 评论(0) 推荐(2) 编辑
摘要:转自:https://www.cnblogs.com/dsj2016/p/5714921.html https://cloud.tencent.com/developer/article/1036756 复杂过程见转的另一篇:https://i.cnblogs.com/PostDone.aspx?p 阅读全文
posted @ 2018-12-20 12:09 twoheads 阅读(3026) 评论(0) 推荐(0) 编辑
摘要:线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。因此为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程 阅读全文
posted @ 2018-09-25 17:36 twoheads 阅读(1492) 评论(0) 推荐(0) 编辑
摘要:思路:通过ThreadPoolExecutor创建线程池,它有一些参数,任务提交给线程池之后的处理流程。不过java doc中,并不提倡我们直接使用ThreadPoolExecutor,而是使用Executors类中提供的几个静态方法来创建线程池,各方法的区别,优缺点,问题。 一.Java中的Thr 阅读全文
posted @ 2018-09-25 10:59 twoheads 阅读(424) 评论(0) 推荐(0) 编辑
摘要:CompletionService原理:内部通过阻塞队列+FutureTask,实现了任务先完成可优先获取到,即结果按照完成先后顺序排序。 一般情况下,使用Runnable接口、Thread实现的线程我们都是无法返回结果的。但是如果对一些场合需要线程返回的结果。就要使用用Callable、Futur 阅读全文
posted @ 2018-09-21 15:43 twoheads 阅读(375) 评论(0) 推荐(0) 编辑
摘要:1. 背景 ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。 ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因 阅读全文
posted @ 2018-09-17 14:21 twoheads 阅读(220) 评论(0) 推荐(0) 编辑
摘要:ThreadLocal是什么 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。 ThreadLocal的实现是这样的:每个Thread 维 阅读全文
posted @ 2018-09-14 14:31 twoheads 阅读(4555) 评论(0) 推荐(0) 编辑
摘要:首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并 阅读全文
posted @ 2018-09-14 11:14 twoheads 阅读(345) 评论(0) 推荐(0) 编辑
摘要:重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。 读写锁维护着一对锁,一个读锁和一个写锁,读 阅读全文
posted @ 2018-09-12 15:59 twoheads 阅读(3412) 评论(0) 推荐(2) 编辑
摘要:概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Condition:ReentrantLock的内部类Sync继承了AQS这个抽象类,Sync的newC 阅读全文
posted @ 2018-09-11 17:27 twoheads 阅读(256) 评论(0) 推荐(0) 编辑
摘要:写入时复制(CopyOnWrite) 什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器 阅读全文
posted @ 2018-09-11 16:00 twoheads 阅读(244) 评论(0) 推荐(0) 编辑
摘要:前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂。针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口。通常,我们处理方法是让代码同步顺序的去调取这些接口。显然,调取接口数量的增加必然会造成响应时 阅读全文
posted @ 2018-09-07 17:51 twoheads 阅读(1903) 评论(0) 推荐(0) 编辑
摘要:概要: AQS维护了一个同步队列 Condition是JUC的一个接口,AQS的ConditionObject实现了这个接口,维护了一个等待队列(等待signal信号的队列) 线程调用reentrantLock.lock()时,线程被加入到AQS同步队列中; 线程A调用condition.await 阅读全文
posted @ 2018-09-05 17:10 twoheads 阅读(1284) 评论(0) 推荐(1) 编辑
摘要:本篇文章将介绍Condition的实现原理和基本使用方法,基本过程如下: 1、Condition提供了await()方法将当前线程阻塞,并提供signal()方法支持另外一个线程将已经阻塞的线程唤醒。 2、Condition需要结合Lock使用 3、线程调用await()方法前必须获取锁,调用awa 阅读全文
posted @ 2018-09-05 14:24 twoheads 阅读(1469) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示