并发编程
文章平均质量分 76
qian_348840260
这个作者很懒,什么都没留下…
展开
-
Synchronized(1) - 偏向锁
Synchronized(1) - 偏向锁在多线程并发编程中,synchronized一直扮演重要的角色,在JAVA SE 1.6版本之前被称为重量级锁。在JAVA SE 1.6中synchronized得到了优化,为了减少锁和释放锁带来的性能消耗而引入了偏向锁和轻量级锁。本文重点介绍偏向锁的实现。1 synchronized实现原理与使用利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下三种形式。 对于普通同步方法,锁是当前实例对象转载 2021-03-19 17:25:34 · 363 阅读 · 0 评论 -
并发组件中的size()方法导致cpu狂飙
import java.util.Date;import java.util.concurrent.ConcurrentLinkedQueue;public class AsyncEventSender { private static final long MAX_BUFFER_SIZE = 10000000; private ConcurrentLinkedQueue<S...原创 2018-06-21 17:16:51 · 293 阅读 · 0 评论 -
ScheduledThreadPoolExecutor使用过程中的两个坑
1.scheduleAtFixedRate和scheduleWithFixedDelay调度的Runnable,是否可以有条件终止。 这个可以参考https://blog.csdn.net/qian_348840260/article/details/106643621的实现。当满足条件时,从线程池中移除这个 Running,其实每个Runnable在执行结束时,才会向线程池中添加下一个周期的任务,如果remove了,这一个Runnable就不会再重复执行了。2.corePoolSize怎...原创 2020-06-09 18:53:26 · 1765 阅读 · 0 评论 -
ScheduledThreadPoolExecutor终止执行runnable
转载:https://www.cnblogs.com/nijunyang/p/12657039.htmlScheduledThreadPoolExecutor之remove方法之前用定时任务的线程池,设置了个任务,但是突然今天产品说,某些个操作需要中断某些任务(如果任务还没有执行),使其不能再到点执行了。于是查了API果然有这样一个方法。一看API,需要移除的是一个Runnable对象,想当然的就把任务调度的传入的Runable对象保留下来,然后进行删除。简要代码如下Runn...转载 2020-06-09 15:36:35 · 5416 阅读 · 2 评论 -
ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)
转载:https://www.cnblogs.com/lijiasnong/p/9963808.htmlHashMap、CurrentHashMap 的实现原理基本都是BAT面试必考内容,阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制深入谈过hashmap的实现原理以及在JDK 1.8的实现区别,今天主要谈CurrentHashMap的实现原理,以及在JDK1.7和1.8的区别。内容目录:1.哈希表2.ConcurrentHashMap与HashMap、HashTabl.转载 2020-06-04 17:51:43 · 264 阅读 · 0 评论 -
happens-before规则和as-if-serial语义
SR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。与程序员密切相关的happens-before规则如下:1、程序顺序规则:一个线程中的每个操作,happens-before于线程中的任意后续操作。2、监视器锁规则:一个锁的解锁,happens-before于随后对这个锁的加锁。3、vol原创 2020-06-03 17:05:06 · 135 阅读 · 0 评论 -
DCL中的单例对象为啥必须要用volatile修饰
创建一个对象时,内存中大致经历如下三个步骤。1.在堆中分配对象内存2.填充对象必要信息+具体数据初始化+末位填充3.将引用指向这个对象的堆内地址什么是指令重排序?有两个层面:在虚拟机层面,为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会按照自己的一些规则(这规则后面再叙述)将程序编写顺序打乱——即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行——以尽可能充分地利用CPU。拿上面的例子来说:假如不是a=1的操作,而是a=new by.原创 2020-06-03 14:54:32 · 381 阅读 · 0 评论 -
volatile和mesi(缓存一致性)
首先强调一点,volatile和mesi这两个东西没有半点关系。mesi是缓存一致性的一种实现手段,多核CPU为了保证缓存数据的一致性,通常有两种实现手段,一种是总线锁,另一种是缓存锁。总线锁性能消耗大,缓存锁则一般通过缓存一致性来实现。因此我们知道mesi是CPU硬件级别的。 volatile是JAVA的一种关键字,实现了两个功能: 1.可见性 2.禁止乱序。 禁止乱序,在JVM层面使用内存屏障来实现,汇编级别通过lock #指令来实现。问题:既然CPU有了MESI协议可以保证cache的一致性,那么原创 2020-06-03 11:45:06 · 3292 阅读 · 10 评论 -
synchronized和reentrantLock的底层实现
实现synchronized的基础: Java对象头 + Monitor对象头的结构如下:虚拟机位数 头对象结构 说明 32/64bit Mark Word 默认存储对象的hashcode,分代年龄,锁类型,锁标志位等信息。 32/64bit Class Metadata Address 类型指针指向对象的类元数据,JVM通过这个指针确定该对象是哪个类的数据。 Mark Word的说明图:而对于Monitor,每个Java对象天生自带一把.原创 2020-06-01 17:31:54 · 772 阅读 · 0 评论 -
锁的四种状态及升级过程
jdk1.6之前的synchronized的实现依赖于底层操作系统的互斥锁(mutex lock),这种锁被称为重量级锁,因为阻塞或唤醒一个Java线程需要操作系统切换CPU状态来实现,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的赶时间可能比用户代码执行的时间还长。JDK6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”。锁的四种状态:无锁、偏向锁、轻量级锁和重量级锁,专门针对synchronized的。在1.6之前,只有重量级锁, 1.6对synchro原创 2020-06-01 17:29:20 · 256 阅读 · 0 评论 -
CAS及ABA问题
compare and swap 是用无锁(java层级)的方式来实现线程安全。底层使用unsafe类,追踪unsafe类的native方法,最终发现底层汇编级别仍然使用lock来实现操作原子性cas成功并非意味着变量在此期间未发生变化,有可能A->B->A,对于原始数据类型,如AtomicInteger可以忽略ABA问题,对于复杂对象(属性可能被更改),需要根据情况来判断是否处理,版本号是解决ABA问题的一种常见手段,典型应用的是AtomicStampedReference...原创 2020-06-01 17:23:06 · 106 阅读 · 0 评论 -
IO密集型线程池
线程池package com.sq.dispatcher.utils;import com.sq.dispatcher.monitor.thread.LogThreadStore;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicInteger;/** * Created by yan...转载 2019-03-22 11:53:10 · 989 阅读 · 0 评论 -
synchronized关键字及实现细节(轻量级锁Lightweight Locking)
在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供Lock API外还在语法层面上提供了synchronized关键字来实现互斥同步原语。那么到底在JVM内部是怎么实现synchronized关键子的呢?一、synchronized的字节码表示: 在java语言中存在两种内建的synchronize转载 2016-06-15 18:41:20 · 640 阅读 · 0 评论 -
ExecutorService的execute和submit方法
在开发过程中,遇到了一个比较奇怪的问题。描述如下:在使用ThreadPoolExecutor时,用到了自定义的线程,并对线程设置了异常捕获策略,如下: public AppThread(Runnable runnable, String name) { super(runnable, name + "-" + CREATED.incrementAndGet());原创 2012-07-16 10:39:34 · 2550 阅读 · 0 评论 -
ThreadPoolExecutor源码分析
这是一篇ThreadPoolExecutor的源码分析,写的还是不错的,可以参考一下:http://www.cnblogs.com/rilley/archive/2012/02/07/2341767.html转载 2012-07-16 11:23:35 · 486 阅读 · 0 评论 -
DCL(双检测锁定-Double Checked Lock)安全性分析(转)
在水木上看到一篇分析DCL(双检测锁定-Double Checked Lock)安全性的文章。记得以前也讨论过这个问题,但是为什么DCL也存在隐患,至今没弄明白,这篇分析做了比较详尽的解释,概括起来原因有两点:一是因为编译器或者处理器并不是严格按照程序顺序进行指令调度。二是java中同步机制的存在。原文来自:发信人: wyxzellux (I still believe...), 信区:转载 2012-06-08 10:42:50 · 2455 阅读 · 0 评论 -
Fork/Join框架介绍
http://blog.csdn.net/lubeijing2008xu/article/details/18036931#t5转载 2014-07-08 13:36:33 · 545 阅读 · 0 评论 -
从ConcurrentHashMap的size操作来看并发编程的技巧
如果我们要统计整个ConcurrentHashMap里元素的大小,就必须统计所有Segment里元素的大小后求和。Segment里的全局变量count是一个volatile变量,那么在多线程场景下,我们是不是直接把所有Segment的count相加就可以得到整个ConcurrentHashMap大小了呢?不是的,虽然相加时可以获取每个Segment的count的最新值,但是拿到之后可能累加前使用的转载 2015-07-28 15:05:53 · 7097 阅读 · 0 评论 -
ConcurrentHashMap原理分析
转载地址:http://www.cnblogs.com/ITtangtang/p/3948786.html 集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyon转载 2016-04-25 18:45:50 · 287 阅读 · 0 评论 -
各种 Java Thread State 第一分析法则
http://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html@郑昀汇总使用 TDA 工具,看到大量 Java Thread State 的第一反应是:1,线程状态为“waiting for monitor entry”:意味着它 在等待进入一个临界区 ,所以它在”Entry Se转载 2016-06-13 15:27:56 · 1009 阅读 · 0 评论 -
不变对象替代synchronized代码块,实现线程安全
servlet实现因式分解的功能,并缓存当前因式分解的结果。该实例演示了使用synchronized和不变对象两种方式来保证线程安全.设计一:使用synchronized代码块实现线程安全@ThreadSafepublic class CachedFactorizer implements Servlet { @GuardedBy("this") private BigInte原创 2012-05-29 18:16:16 · 1142 阅读 · 0 评论