
Java并发编程
Der_Dream
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java NIO与多线程Reactor模式
Java1.4开始,提供了新的非阻塞IO操作的API,用来替代Java BIO和网络编程相关的API。Java NIO包括三个核心组件:Buffer缓冲区、Channel通道、Selector选择器。Buffer缓冲区缓冲区本质上是一个可以写入数据的内存块(可以是数组),然后可以从中读取数据。此内存块包含在NIO Buffer对象中,该对象提供了一组较方便地使用内存块的方法,相比较直接对数组操...原创 2019-08-19 16:46:38 · 771 阅读 · 0 评论 -
HashMap底层实现与原理解析,JDK1.7与1.8的区别
HashMap是基于Map接口的实现,采用key-value形式存储,在项目开发中,这种容器使用是非常广泛的,本文主要就是对HashMap的底层原理做个剖析,首先对比HashMap与HashTable的区别,然后以jdk1.7为例介绍HashMap的实现,再介绍jdk1.8做的改动。对比:HashTable、HashMapHashtable 是早期Java类库提供的一个哈希表实现,本身是同步...原创 2019-08-12 16:44:42 · 3146 阅读 · 2 评论 -
手写Lock锁与AQS抽象队列同步器
手写Lock锁锁的实现需要:两个方法:lock()、unlock()两个组件:锁的持有者、等待队列代码:public class CustomLock implements Lock{ //当前前程 AtomicReference<Thread> current = new AtomicReference(); //等待队列 LinkedBl...原创 2019-08-11 21:53:53 · 321 阅读 · 0 评论 -
高性能编程专题--多线程并发编程--锁的概念和synchronized关键字原理
在开始前,先介绍一下Java中有关锁的概念。从不同的维度,锁可以有不同的分类方式:乐观锁:假定没有并发冲突,在尝试修改数据时会有一个比较的过程,如果发现数据和之前获取的不一致,则读取最新数据,再次操作并重新尝试修改悲观锁:假定一定会有并发冲突,直接同步所有对数据的相关操作,从读取数据就开始上锁自旋锁:为了不放弃CPU执行时间,循环使用CAS技术对数据尝试进行更新,直至成功。自旋锁是一种乐观...原创 2019-08-09 19:10:34 · 261 阅读 · 0 评论 -
Java线程安全之CAS原子操作
1.竞态条件与临界区多个线程访问了相同的资源,向这些资源做了写操作时,对执行顺序有要求。临界区:方法内部某些部分区域代码,如果多线程执行时,会对结果产生不可预测影响。竞态条件:当临界区代码被多线程执行时,产生竞态条件。2.共享资源如果一段代码是线程安全的,则它不包含竞态条件。只有当多个线程更新共享资源时,才会产生竞态条件栈封闭时,不会在线程之间共享变量,因此是线程安全的局部对象引用本...原创 2019-08-08 16:19:34 · 196 阅读 · 0 评论 -
Java内存模型JMM与可见性问题
在讲述Java内存模型之前,先介绍几个概念:指令重排序,Java运行模式1.指令重排序java编程语言的语义允许编译器和处理器执行指令重排序优化,以提高程序运行效率。指令重排序需遵守as-if-serial,as-if-serial指的是:不管怎么重排序,单线程程序的执行结果不能被改变。编译器和处理器都必须遵守as-if-serial语义。也就是说,编译器和处理器不会对存在数据依赖关系的操...原创 2019-05-19 14:43:21 · 219 阅读 · 0 评论 -
Java线程池应用及实现原理
为什么要用线程池:线程在java中是一个对象,更是操作系统的资源,线程的创建销毁需要时间。如果创建+销毁时间>执行任务时间就很不划算。 java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小为1M,这个栈空间是需要系统内存中分配的。因此线程过多,会消耗很多内存。 操作系统需要频繁切换线程上下文,影响性能。通过使用线程池可以控制线程数量,并且实现线程...原创 2019-05-15 22:17:05 · 210 阅读 · 0 评论 -
Java并发基础--CPU性能优化与内存屏障
为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化:1.CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用高速缓存以提高性能。CPU缓存分为多几缓存,如图L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存容量在32-4096KB。 L2 由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在...原创 2019-05-14 16:07:40 · 719 阅读 · 0 评论 -
Java线程状态与线程通讯wait/notify,park/unpark机制
Java线程状态Java线程共有6个状态,在java.lang.Thread.State中明确定义。线程状态图:1.NEW 尚未启动的线程的状态2.Runnable 可运行的线程的状态,包括等待CPU调度和正在运行的线程的状态3.Blocked 等待监视器锁的阻塞线程的状态,处于synchronized同步代码块或方法中被阻塞4.Waiting 等待线程的状态。...原创 2019-05-13 20:41:17 · 1304 阅读 · 0 评论 -
ConcurrentHashMap原理解析,jdk1.7与1.8区别
总所周知,HashMap是非线程安全的工具类,在多线程环境下就需要一个线程安全的工具类来帮助我们实现线程安全,jdk1.5之前,我们使用HashTable,HashTable只是用synchronized同步关键字将put等大多数方法进行加锁,锁定的是整个对象,因此效率不高,jdk1.5之后,ConcurrentHashMap随着j.u.c包一起引入了JDK中,相对于HashTable,Concu...原创 2019-08-15 12:18:57 · 1153 阅读 · 0 评论 -
FutureTask源码解析
在Java中,我们知道创建线程有两种方式,继承Thread类或者实现Runnable 接口,但是这两种方式都是不能获取方法返回结果的。如果想获取结果,就需要做一些额外的处理,利用共享变量,线程间通信等方式,使用起来就不是很方便,对于不熟悉的人还可能出现线程安全问题。jdk1.5之后,提供了FutureTask类,以及Callable、Future接口,实现了对异步获取返回结果的支持。Callab...原创 2019-08-16 14:14:59 · 259 阅读 · 0 评论