Java并发来一发
文章平均质量分 93
WalkOffTheEarth
这个作者很懒,什么都没留下…
展开
-
Java并发来一发(十四)ThreadLocal
1、ThreadLocal简介java.lang.ThreadLocal是线程本地变量,意为每个线程私有的变量,不同线程间不共享。它的意义在于线程间的数据隔离。ThreadLocal有个内部类ThreadLocalMap,key就是当前线程,value就是线程正在执行的任务中的某个变量的包装类Entry。2、ThreadLocal使用姿势ThreadLocal变量需要定义为st...原创 2018-12-11 15:53:13 · 152 阅读 · 0 评论 -
Java并发来一发(九)ReentrantReadWriteLock
一、ReentrantReadWriteLock简介ReentrantReadWriteLock允许同一时间有一个写线程或多个读线程,满足了对读写并发控制有不同需求的场景,相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,因此JDK提供了这个读写锁。ReentrantReadWriteLock支持以下特性:支持公平和非公平的获取锁的方式...原创 2018-12-03 18:36:09 · 130 阅读 · 0 评论 -
Java并发来一发(八)ReentrantLock
一、ReentrantLock简介ReentrantLock可重入锁,全名java.util.concurrent.locks.ReentrantLock,相当于是个最基础版本的Lock的实现,针对公平锁和非公平锁,ReentrantLock都有实现。二、ReentrantLock特性1、可轮询锁和定时锁可以通过调用trylock方法,查询锁的状态,如果锁已经被其他线程持有,则不会...原创 2018-12-03 17:53:22 · 168 阅读 · 0 评论 -
Java并发来一发(十六)分布式事务一致性
目录一、概论二、CAP定理三、BASE理论四、2PC五、3PC六、XA协议七、TCC模型八、Raptor一、概论系统或DB的拆分会使得数据服务往往不在一个单点系统中,数据一致性也就变成了分布式事务问题。本文主要讨论分布式事务一致性解决方案。一致性可理解为所有节点都能访问到最新版本的数据,单机情况下使用共享内存和锁就可以解决,但在分布式环境下,要满足一致性...原创 2018-12-12 18:27:23 · 372 阅读 · 0 评论 -
Java并发来一发(七)队列同步器AQS
一、AQS简介队列同步器AbstractQueuedSynchronizer(简称AQS)是用来构建锁或其他同步组件的基础框架,它服务的是锁的实现者。AQS有一个变量表示同步状态,通过内置的FIFO管理线程排队,基于AQS可以将同步状态管理、线程排队、等待与唤醒等操作对锁屏蔽,简化锁的实现方式。同步器的设计是基于模板方法的,使用者需要重写同步器指定的方法,然后将同步器组合在自定义同步组件的...原创 2018-12-03 15:34:18 · 171 阅读 · 0 评论 -
Java并发来一发(六)Lock接口
一、Lock接口的引入由于synchronized关键字有些缺陷,如无法响应中断等,出现了Lock接口。相对于synchronized,Lock有如下补充:Lock可以响应中断; Lock可以得知线程是否已经获得锁; Lock可以提供更为复杂的读写锁,以应对读写同时存在的场景。Lock相对于synchronized还有如下区别:synchronized是Java关键字,是基于JV...原创 2018-12-03 10:57:13 · 147 阅读 · 0 评论 -
Java并发来一发(四)volatile关键字
一、volatile特性volatile的两点特性:禁止指令重排序、保证内存可见性。volatile不能保证原子性。1、禁止指令重排原理:volatile关键字通过提供内存屏障的方式来防止指令被重排序,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。volatile禁止指令重排序的一些规则:在每个volatile写操作前插入StoreStore屏障...原创 2018-11-30 21:13:57 · 135 阅读 · 0 评论 -
Java并发来一发 --- 目录
1、Java内存模型Java并发来一发(一)Java内存模型2、多线程和线程池Java并发来一发(二)多线程四种实现方式Java并发来一发(三)Java线程池3、volatile和synchronizedJava并发来一发(四)volatile关键字Java并发来一发(五)synchronized关键字4、Java中的锁Java并发来一发(六)Lock接口J...原创 2018-11-30 18:20:59 · 172 阅读 · 0 评论 -
Java并发来一发(五)synchronized关键字
目录一、synchronized底层原理二、JVM对sychronized的优化三、synchronized特性一、synchronized底层原理1、Java对象头与MonitorJVM中对象在堆内存中的数据分为三部分,对象头、实例数据和对齐填充。其中,对象头的内容包括Mark Word和类元数据,而Mark Word默认情况下存储着对象的HashCode、分代年龄、锁位...原创 2018-12-02 23:01:29 · 217 阅读 · 0 评论 -
Java并发来一发(十三)线程的等待与通知机制
本文介绍的是Object的监视器方法wait/notify等,一般与sychronized关键字配套使用。相关方法如下,所有方法使用的前提都是先获得锁:wait(),调用该方法后线程进入等待状态,线程加入到等待队列,直到另一个线程通知或中断。 wait(long),线程进入超时等待状态,线程加入到等待队列,直到另一个线程通知或中断,或过一定毫秒数后返回。 wait(long,int),...原创 2018-12-04 21:19:58 · 173 阅读 · 0 评论 -
Java并发来一发(三)Java线程池
目录一、线程池概念二、线程池状态三、Excecutors四种创建线程池方法四、Java中的ThreadPoolExecutor类五、线程执行流程六、一个简单的线程池实现一、线程池概念线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代...原创 2018-11-30 11:05:31 · 283 阅读 · 2 评论 -
Java并发来一发(十二)CountDownLatch和CyclicBarrier
一、CountDownLatchjava.util.concurrent.CountDownLatch可以允许一个或多个线程等待其他线程操作。从countdown字面意义也可以理解,它是类似于一个倒计时锁,这个倒计时是原子操作,同一时刻只能有一个线程操作倒计时。CountDownLatch应用实例,短跑比赛计排名,代码如下:public class CountDownLatchTes...原创 2018-12-04 12:28:19 · 136 阅读 · 0 评论 -
Java并发来一发(十一)Java中的原子操作类
一、原子操作类简介JDK1.5开始提供了java.util.concurrent.atomic包,其中有一系列用法简单、性能高效、可以线程安全更新变量的原子操作类,目前(JDK1.7)大概有这么些:二、原子操作类实现原理以AtomicInteger为例看下源码,其中的两个方法getAndSet,getAndIncrement,都是无限循环调用compareAndSet,直到成功,C...原创 2018-12-04 11:37:30 · 163 阅读 · 0 评论 -
Java并发来一发(十)Condition接口
一、Condition接口简介java.util.concurrent.locks.Condition是java并发包中的一个接口,是为配合Lock提供的线程等待/通知功能。我们知道Object的监视器方法wait()和notify()配合sychronized关键字一样可以实现等待/通知机制,Condition的优势在于它可以为多个线程间建立不同的Condition,控制粒度更细。如阻塞队列...原创 2018-12-04 11:16:11 · 181 阅读 · 0 评论 -
Java并发来一发(一)Java内存模型
目录一、原子性、可见性和有序性二、JMM概念三、指令重排四、happens-before规则一、原子性、可见性和有序性提到并发编程就得搞清楚原子性、可见性、有序性这三大性质,搞不清这三个性质,后面的概念也就很模糊。1、原子性概念:一个操作或多个操作,要么全部执行且执行过程不被中断,要么不执行。如何保证原子性:synchronized关键字或Lock可以保证原子性...原创 2018-11-29 15:52:40 · 151 阅读 · 0 评论 -
Java并发来一发(二)多线程四种实现方式
Java实现多线程的方式Java实现多线程的方式有4种:继承Thread方法、实现Runnable接口、实现Callable接口并通过FutureTask创建线程、使用ExecutorService。其中,前两种线程执行结果没有返回值,后两种是有返回值的。1、继承Thread方法Thread类实现了Runnable接口,通过调用start()方法启动线程。这种方式实现多线程...原创 2018-11-24 21:12:04 · 432 阅读 · 0 评论 -
Java并发来一发(十五)zookeeper
一、zookeeper简介ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。简单地说,zookeeper维护了一个类似于文件系统的树状结构,结构上的节点znode可以自由地增删,当节点发生变动时,zookeeper会通知客户端。为了...原创 2018-12-12 15:53:17 · 192 阅读 · 0 评论