并发
石头dhf
三人行必有吾师!
展开
-
Java多线程 -- 深入理解JMM(Java内存模型) --(六)final
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/]与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一原创 2018-02-24 23:18:26 · 170 阅读 · 0 评论 -
Java多线程 -- 深入理解JMM(Java内存模型) --(一)基础
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/]并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,转载 2018-02-25 16:16:23 · 226 阅读 · 0 评论 -
Java多线程 -- 深入理解JMM(Java内存模型) --(二)重排序
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/]数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a = 1;b = a;写一个变量之后,再读转载 2018-02-25 16:30:48 · 214 阅读 · 0 评论 -
ThreadPoolExecutor线程池源码解析
关键构造属性: volatile int runState; 保证了多线程的共享可见性 static final int RUNNING = 0; static final int SHUTDOWN = 1; 运行了SHUTDOWN static final int STOP = 2; ...原创 2018-03-12 23:50:43 · 446 阅读 · 0 评论 -
【Java 并发】详解 ThreadLocal
目录前言线程局部变量使用示例具体实现ThreadLocalMap副本变量存取ThreadLocal 散列值应用场景参考文章 前言ThreadLocal 主要用来提供线程局部变量,也就是变量只对当前线程可见,本文主要记录一下对于 ThreadLocal 的理解。更多关于 Java 多线程的文章可以转到 这里。线程局部变量在多线程环境下,之所以会有并发问题,就是因为不同的线程会同时访问同一个共享变量,...原创 2018-03-22 22:19:25 · 137 阅读 · 0 评论 -
AtomicInteger源码解析
AtomicInteger,由于存储的值的value是volatile类型所有具有线程可见性。通过CAS比较交换进行自增,或者更新值具有原子性。所以AtomicInteger是线程安全的具有类锁一样的线程安全性。具体参见下面源码解析: private static final Unsafe unsafe = Unsafe.getUnsafe(); private static fina...原创 2018-03-14 15:45:37 · 135 阅读 · 0 评论 -
volatile是否能保证数组中元素的可见性?
在javaeye有位朋友问了我一个非常好的问题。问题一个线程向volatile的数组中设置值,而另一个线程向volatile的数组中读取。比如seg.setValue(2),随后另一个线程调用seg.getValue(2),前一个线程设置的值对读取的线程是可见的吗?我看书上说volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素。ConcurrentHashMap中也有这...转载 2018-04-05 17:41:13 · 853 阅读 · 0 评论 -
多线程 ForkJoinPool
背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来即可。这种思想值得学习。主要参考《疯狂java讲义》回到顶部使用Java7 提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的...转载 2018-05-08 22:34:07 · 203 阅读 · 0 评论 -
synchronized原理
synchronized 是JVM基于进入和退出Monitor对象来实现同步的。Monitorenter和monitorexit指令。jDK1.6为了优化锁引入了偏向锁和轻量级锁。1、偏向锁:检查对象头Markword是否存储了线程的ID,如果进行CAS尝试把对象头mark word替换为自己线程ID。偏向锁撤销:再有一个线程CAS 对象头 Mark word 到线程ID 失败,在安全点进行撤销原...原创 2018-04-25 11:51:32 · 125 阅读 · 0 评论 -
Java多线程里总线锁定和缓存一致性的问题
随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性,比如处理器需要保证读一个字节或写一个字节是原子的,那么它是如何实现的呢?有两种机制:总线锁定和缓存一致性。下面,尚学堂陈老师简单为大家分享总线锁定和缓存一致性的问题。我们知道,CPU和物理内存之间的通信速度远慢于CPU的处理速度,所以CPU有自己的内部缓存,根据一些规则将内存中的数据读取到...转载 2018-06-23 16:58:25 · 339 阅读 · 0 评论 -
java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
转载:https://blog.csdn.net/zqz_zqz/article/details/70233767之前做过一个测试,详情见这篇文章《多线程 +1操作的几种实现方式,及效率对比》,当时对这个测试结果很疑惑,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对); 2. AtomicInteger效率最不稳定,不同并发情况下...转载 2018-06-23 18:30:18 · 182 阅读 · 0 评论 -
深入分析Volatile的实现原理
转载:https://www.cnblogs.com/study-everyday/p/6707287.html引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchro...原创 2018-06-25 09:22:07 · 116 阅读 · 0 评论 -
理解linux cpu load - 什么时候应该担心了
译文原文: http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages 你可能已经很熟悉linux的平均load. 平均load是3个数 (可以用uptime或者top命令查看), 他们看着像下面这样:<span style="color:#000000"><code><sp...转载 2018-07-24 08:43:06 · 162 阅读 · 0 评论 -
cpu使用率低负载高
cpu低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去执行别的任务或空闲,具体场景有如下几种。场景一:磁盘读写请求过多就会导致大量I/O等待上面说过,cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任...转载 2018-08-28 11:45:55 · 759 阅读 · 0 评论 -
聊聊QPS/TPS/并发量/系统吞吐量的概念
我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大。这个问题从业务上来讲,可以理解为应用系统每秒钟最大能接受的用户访问量。或者每秒钟最大能处理的请求数; QPS: 每秒钟处理完请求的次数;注意这里是处理完。具体是指发出请求到服务器处理完成功返回结果。可以理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS。 T...转载 2018-09-06 10:18:23 · 622 阅读 · 0 评论 -
Java多线程 -- 单例模式的Double-checked Locking (DCL)问题
Double-checked Locking (DCL)用来在lazy initialisation 的单例模式中避免同步开销的一个方法。下面是这么做的一个例子。[java] view plaincopypublic class MyFactory { private static MyFactory instance;转载 2018-02-24 22:17:24 · 171 阅读 · 0 评论 -
Java多线程 -- 正确使用Volatile变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特原创 2018-02-24 22:15:08 · 408 阅读 · 0 评论 -
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313happen—before规则介绍 Java语言中有一个“先行发生”(happen—before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,“转载 2017-07-04 00:17:11 · 243 阅读 · 0 评论 -
Java中CAS详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制转载 2017-07-03 14:12:13 · 258 阅读 · 0 评论 -
并发编程1-线程池实现原理解析
1、线程池的实现原理:1)、当线程池初始化时,线程池里没有线程,当提交一个任务到线程池后,判断核心线程池里的线程数是否达到corePoolSize,如果没有则进行创建一个新的工作线程来执行任务。2)、如果核心线程池已经满,则把任务准备添加到工作队列,判断工作队列是否已经满,如果没有满添加到工作队列等待线程来取;工作中的线程完成工作后会从工作队列取新的任务进行执行;3)、如果工作队列满了原创 2017-08-24 16:57:20 · 284 阅读 · 0 评论 -
并发编程-volatile原理和应用
volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性。原理:1)、volatile变量在写操作指令编译为汇编指令时在后面会添加Lock前缀指令引起处理器缓存写回到内存。 2)、一个处理器的缓存写回到内存会导致其他处理器的缓存无效。缓存一致性:多处理器下每个处理器通过嗅探在总线上传播的数据来检查自己的数据缓存的值是不是过期了,当处理原创 2017-08-24 20:27:07 · 177 阅读 · 0 评论 -
并发编程-synchronized的实现原理和应用
synchronized称为重量级锁,在JDK1.6后对它进行了多种优化,引入了偏向锁和轻量级锁。原理:在JVM中基于进入和退出Monitor(监视器)对象来实现的,编译后monitorenter指令插入到同步代码块的开始位置,而monitorexit是插入到结束和异常处。在内存里的存储结构和升级过程:HotSpot对象头分为两部分:第一部分存储类如哈希码、GC分代年龄、锁标志,第二部原创 2017-08-24 22:55:03 · 223 阅读 · 0 评论 -
ConcurrentHashMap是弱一致的
本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS §17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentH...转载 2018-01-27 16:34:21 · 713 阅读 · 0 评论 -
Java多线程 -- 深入理解JMM(Java内存模型) --(三)顺序一致性
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/]数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步...转载 2018-02-27 09:19:27 · 157 阅读 · 0 评论 -
Java 内存屏障
jvm运行时刻内存分配在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配。其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副...原创 2018-02-27 11:30:51 · 2721 阅读 · 0 评论 -
Java多线程 -- 深入理解JMM(Java内存模型) --(四)volatile
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/]volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:[java] vie...转载 2018-02-27 11:56:25 · 181 阅读 · 0 评论 -
Java 并发AQS注解
一、waitStatus属性: 在AQS的Node中有每个Node自己的状态(waitStatus),我们这里归纳一下,分别包含:SIGNAL 从前面的代码状态转换可以看得出是前面有线程在运行,需要前面线程结束后,调用unpark()方法才能激活自己,值为:-1CANCELLED 当AQS发起取消或fullyRelease()时,会是这个状态。值为1,也是几个状态中唯一一个大于0的状态,所以前面判...原创 2018-02-28 18:26:16 · 389 阅读 · 0 评论 -
线程状态详解
转载:http://www.cnblogs.com/waterystone/p/4920007.html一. 线程状态转换图 注意:调用obj.wait()的线程需要先获取obj的monitor,wait()会释放obj的monitor并进入等待态。所以wait()/notify()都要与synchronized联用。详见:JAVA多线程之wait/notify1.1 阻塞与等待的区别阻塞:当一...转载 2018-02-28 18:43:08 · 601 阅读 · 0 评论 -
ReenTrantReadWriteLock源码分析
1、读写状态设计,低十六位代表写,高16位代表读.ReentrantLock中,我们知道锁的状态是保存在Sync实例的state字段中的(继承自父类AQS),现在有了读写两把锁,然而可以看到还是只有一个Sync实例,那么一个Sync实例的state是如何同时保存两把锁的状态的呢?答案就是用了位分隔:state字段是32位的int,读写锁用state的低16位保存写锁(独占锁)的状态;高16位保存读...原创 2018-03-01 12:11:45 · 243 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码分析之条件队列-Condition
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException();//添加到队尾,添加时移除失效节点。/*在addConditionWaiter方法中,如果发现条件队列尾结点已取消就...原创 2018-03-01 16:36:27 · 273 阅读 · 0 评论 -
从jvm的角度来看java的多线程
转载:http://www.cnblogs.com/sheeva/p/6366782.html最近在学习jvm,发现随着对虚拟机底层的了解,对java的多线程也有了全新的认识,原来一个小小的synchronized关键字里别有洞天。决定把自己关于java多线程的所学整理成一篇文章,从最基础的为什么使用多线程,一直深入讲解到jvm底层的锁实现。多线程的目的为什么要使用多线程?可以简单的分两个方面来说...转载 2018-03-01 22:48:52 · 176 阅读 · 0 评论 -
java多线程:synchronized和lock比较浅析
转载:https://www.cnblogs.com/shangxiaofei/p/6482968.htmlsynchronized是基于jvm底层实现的数据同步,lock是基于Java编写,主要通过硬件依赖CPU指令实现数据同步。下面一一介绍一、synchronized的实现方案1.synchronized能够把任何一个非null对象当成锁,实现由两种方式:a.当synchronized作用于非...转载 2018-03-02 22:29:48 · 184 阅读 · 0 评论 -
[转]深入理解DCL(双检锁)的安全性
对于双检锁,其实有多种不同的用法,有很多种用法是无论如何不会出现问题的.我最初用双检锁来获取jndi对象时,立即有人告诉我双检锁是不安全的,我笑着告诉他:是否安全我比你更有把握.static DataSource ds = null;public static DataSource getDataSource(){ if(ds == null){ synchronized(this.ge转载 2018-02-24 16:18:23 · 286 阅读 · 0 评论 -
JAVA并发编程学习笔记之CAS操作
CAS操作CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。我们常常做这样的操作[java] view plain copy print?if(a==b) { a++; } if(a==b) { a++;}试想一下如果在做a++之前a的值被改变了怎转载 2017-07-06 11:35:07 · 206 阅读 · 0 评论