并发编程
Java并发编程基础知识以及使用过程中遇到的一些问题
水田如雅
不生产代码,只是代码的搬运工
展开
-
Guava:使用ListenableFuture来执行有返回值的线程任务
首先来定义一个任务: @Getter @Setter @AllArgsConstructor class GetThreadReturnResult implements Callable<String>, Serializable { private static final long serialVersionUID = 2277437296426921203L; private String id; @Overr原创 2021-12-21 15:05:47 · 895 阅读 · 0 评论 -
volatile实现解析
反汇编生成代码 使用测试代码,观察value值生成的汇编代码: volatile int value = 1; @Test public void test() { value++; } 反汇编观察value++时候的代码: 0x000000011541f775: lock addl $0x0,(%rsp) ;*putfield queue addl操作前面,会加入一个lock前缀指令。 下面来查询lock前缀指令的作用:lock 描述翻译: lo原创 2021-12-16 15:35:36 · 749 阅读 · 0 评论 -
synchronized实现解析
JVM层的实现 对于代码: int dataV = 1; public synchronized void changeData() { dataV++; } public void readData() { synchronized (this) { System.out.println(dataV); } } 同步代码块 首先来看代码块方法readData反编译之后: 对于同步代码快,反编译原创 2021-12-16 18:00:30 · 309 阅读 · 0 评论 -
Java一些并发类实现原理
基础元素 实现原理 volatile Lock前缀指令+JMM+缓存一致性模型+内存屏障(JMM内存屏障映射为操作系统内存屏障) synchronized 锁升级(优化 ),monitor对象+等待通知(重量级锁) final JMM保证 cas cmpxchg ...原创 2021-12-18 14:46:12 · 749 阅读 · 0 评论 -
线程同步控制
CyclicBarrier int iMax = 100; CyclicBarrier barrier = new CyclicBarrier(iMax); int shareValue = 0; Lock lock = new ReentrantLock(); @Test public void test() throws Exception { for (int i = 0; i < iMax; i++) { Some原创 2021-11-23 18:37:37 · 175 阅读 · 0 评论 -
Java并发编程入门——详解线程及基本锁的获取释放
context 1:构建简单的GUI线程和数据线程工作模式 GUI初始化和数据初始化 为了为我们所有的test构建一个上下文的context,首先我们来写几个类,来简单模拟下我们安卓中,GUI线程和数据线程是如何来显示按钮和数据的: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCc9Hxjh-1580648242992)(1.1ModelAndView.png)...原创 2020-02-02 20:58:04 · 575 阅读 · 0 评论 -
Java并发编程集锦
学习工具 Java Concurrent Animated程序,演示动画及代码: 官方网址是:http://sourceforge.net/projects/javaconcurrenta/ 下载地址:http://sourceforge.net/projects/javaconcurrenta/files/latest/download?source=files 书籍 并发编程的艺术(关腾飞)...原创 2019-10-18 15:50:16 · 241 阅读 · 0 评论 -
Java并发编程的艺术——原子操作的实现原理
原子操作的定义 atomic,表面上,指的是不能进一步分割的最小粒子。借鉴我们在数据库中学的事务的概念,atomic operation,意为——不可被中断的一个或者一系列操作。 处理器如何实现原子操作 使用总线锁保证原子性 如果多个处理器同时对共享变量进行读改写操作,例如,i++操作,那么共享变量会被多个处理器同时操作,这样读改写操作就不是原子的了。例如,cpu1将共享变量i=1读到自己的缓存,...原创 2018-11-10 22:23:20 · 818 阅读 · 0 评论 -
Java并发编程的艺术——volatile和synchronized实现原理
volatile volatile变量修饰的共享变量进行写操作时候,会都出lock前缀指令。 lock前缀指令在多核处理器下会引发一下两件事情: 将当前处理器缓存行的数据协会到系统内存。 这个写回内存的操作会是在其他CPU里缓存了改内存地址的数据无效。 总结下volatile的两条实现原则: Lock前缀指令会引起处理器缓存会写到内存。 一个处理器的缓存回写到内存会导致其他处理器的缓存无效。...原创 2018-11-10 21:14:27 · 307 阅读 · 0 评论 -
Java -- 读写锁
对于读多写少的场景,我们此时应该允许读锁的多次重入,提高读操作的并发性,在这种情况下,我们将读写锁分离。 /** * 线程安全的local cache demo */ class LocalCache { private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); ...原创 2018-10-31 22:33:15 · 837 阅读 · 0 评论 -
ReentrantLock——公平锁与非公平锁对比
/** * 公平锁非公平锁 */ @Test public void FairLockAndNotFairLockTest() throws Exception { ReentrantLock2 fairLock = new ReentrantLock2(true); ReentrantLock2 unFairLock = ne...原创 2018-10-31 18:13:15 · 469 阅读 · 0 评论 -
AtomicReference
类似于AtomicLong等原子类一样,为了保证引用对象的原子性,可以采用AtomicReference。 private Person person = new Person("lhc", 12); private AtomicReference&lt;Person&gt; personReference = new AtomicReference&lt;&gt;(person); ...原创 2018-10-31 15:59:20 · 961 阅读 · 0 评论 -
《Java并发编程的艺术》读书笔记——线程池实现原理
线程池的好处: 1,降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2,提搞响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3,提高系统的客观理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。一,线程池的实现原理当想一个线程池提交一个原创 2018-01-23 23:22:09 · 687 阅读 · 1 评论 -
Java——等待通知模型
** * \* Created: liuhuichao * \* Date: 2018/1/15 * \* Time: 下午5:10 * \* Description:等待--通知模型 * \ */ public class WaitNotifyDemo { static Object lock=new Object(); static Boolean flag=tr原创 2018-01-16 17:47:08 · 603 阅读 · 0 评论 -
Java——等待,超时,通知模型
在原有的等待通知模型上,我们可以加上等待的时间,来避免长时间的等待:/** * \* Created: liuhuichao * \* Date: 2018/1/16 * \* Time: 下午6:09 * \* Description:等待,通知,超时模型 * \ */ public class WaitNotifyTimeOutDemo { static Object l原创 2018-01-16 21:47:14 · 1406 阅读 · 1 评论 -
Java——线程池的使用
一,线程池的创建1,使用execute方法/** * \* Created: liuhuichao * \* Date: 2018/1/24 * \* Time: 下午3:15 * \* Description:execute * \ */ public class ThreadPoolTest { static Integer threadCount=4; sta原创 2018-01-24 21:29:52 · 423 阅读 · 1 评论 -
Java线程池笔记——合理的配置线程池
要想合理的配置线程池,就必须首先分任务特性,可以从以下几个角度来分析。 任务的性质:CPU密集型任务,IO密集型任务和混合型任务。 任务的优先级:高中低。 任务的执行时间:长,中,短。 任务的依赖性:是否依赖其他系统资源,如数据库连接。 性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务应该配置尽可能小的线程,如配置N(CPU)+1个线程的线程池。由于IO密集型任务线程并不是一原创 2018-01-24 22:02:51 · 878 阅读 · 1 评论 -
Java——基于等待通知超时模式的连接池
连接池对象:/** * \* Created: liuhuichao * \* Date: 2018/1/15 * \* Time: 下午1:35 * \* Description:连接池类-负责创建,持有连接 * \ */ public class ConnectionPool { private LinkedList pool=new LinkedList<>();//从原创 2018-01-18 21:14:22 · 492 阅读 · 0 评论 -
Java 并发编程笔记——使用循环cas实现原子操作
一,使用循环CAS示例 JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。 /** * \* Created: liuhuichao * \* Date: 2018/1/27 * \* Time: 下午5:32 * \* Description:cas操作比较 * \ */ public class Co原创 2018-01-27 21:06:52 · 786 阅读 · 3 评论 -
Java并发模型基础(笔记)——并发模型的两个关键问题
在并发编程中,需要处理两个关键问题:线程之间如何通信以及线程之间如何同步。 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没用公共状态,线程之间必须通过发送消息来显示进行通信。 同步是指程序中用于控制不同线程间操作发原创 2018-02-14 12:32:17 · 525 阅读 · 0 评论 -
Java并发编程笔记——JMM
Java线程之间的通信由Java内存模型控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。如上图,如果线程A要与线程B通信的话,需要经过下面两个步骤: 1,线程A把本地内存A中原创 2018-02-18 16:08:14 · 405 阅读 · 0 评论 -
Java并发编程笔记——从源代码到指令序列的重排序
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分为下面三种: 1,编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2,指令级并行的重排序。现代处理器采用了指令集并行技术来将多条指令重叠执行。如果不存在数据依赖,处理器可以改变语句对应机器指令的执行顺序。 3,内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可原创 2018-02-18 16:36:07 · 561 阅读 · 0 评论 -
Java——几种并发流程控制总结
一,CountDownLatch 功能:运行一个或多个线程等待其他线程完成操作。通过计数来判断是否可以在等待点上继续向下执行。一般有N个关键点需要执行完成才能返回,则CountDownLatch类的初始值就初始化为N。示例代码:/** * \* Created: liuhuichao * \* Date: 2018/1/23 * \* Time: 下午9:43 * \* Descript原创 2018-01-23 22:48:53 · 1315 阅读 · 0 评论