首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏狗哥的 Java 世界

    Java 并发8)CyclicBarrier 源码分析

    现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。

    48910发布于 2020-04-14
  • 来自专栏专注 Java 基础分享

    并发而生的 ConcurrentHashMap(Java 8

    当然,它毕竟不是并发容器,除非大改,否则依然是不能应对高并发场景的,或者说即使没有因多线程访问而造成什么问题,但是效率必然是受到影响的。 本篇文章将要介绍的 ConcurrentHashMap 是 HashMap 的并发版本,它是线程安全的,并且在高并发的情境下,性能优于 HashMap 很多。 我们主要从以下几个方面对其进行学习: 历史版本的实现演变 重要成员属性的介绍 put 方法实现并发添加 remove 方法实现并发删除 其他的一些方法的简单介绍 一、历史版本的实现演变 jdk 1.7 三、put 方法实现并发添加 对于 HashMap 来说,多线程并发添加元素会导致数据丢失等并发问题,那么 ConcurrentHashMap 又是如何做到并发添加的呢? = 0) { //链表深度超过 8 转换为红黑树 if (binCount >= TREEIFY_THRESHOLD) treeifyBin

    2.7K120发布于 2018-01-04
  • 来自专栏精讲JAVA

    Java 8Java 9 中并发工具的改变

    来源:鸟窝, colobu.com/2018/03/12/Concurrency-Utilities-Enhancements-in-Java-8-Java-9/ 转自:ImportNew Java 8Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。 的新方法 集合框架 在Java 8中做了修订,基于 stream 和 lambda表达式 添加了很多聚合方法。 java.util.concurrent.atomic中的新类 为了并发计算count、sum, 新引入了 DoubleAccumulator , DoubleAdder , LongAccumulator / Java 8Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。

    70520发布于 2018-07-30
  • 来自专栏精讲JAVA

    Java 8Java 9 中并发工具的改变

    来源:鸟窝, colobu.com/2018/03/12/Concurrency-Utilities-Enhancements-in-Java-8-Java-9/ 转自:ImportNew Java 8Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。 的新方法 集合框架 在Java 8中做了修订,基于 stream 和 lambda表达式 添加了很多聚合方法。 java.util.concurrent.atomic中的新类 为了并发计算count、sum, 新引入了 DoubleAccumulator , DoubleAdder , LongAccumulator / Java 8Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。

    72820发布于 2018-07-30
  • 来自专栏JAVA并发编程

    JAVA并发编程系列(8)CountDownLatch核心原理

    和之前文章一样,我们通过现实案例出发,最后抛出主角方式带大家由浅入深了解并发编程核心知识点。 一、面试真题:模拟拼团我们利用CountDownLatch倒计时的特性,多线程并发条件下,多线程可以调用CountDownLatch.countDown()方法进行减1,然后等候信号的线程调用CountDownLatch.await package lading.java.mutithread;import java.util.HashSet;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * 模拟拼团,满10人成团 */public class Demo009CountDownLatch { public static

    32320编辑于 2024-09-19
  • 来自专栏bit哲学院

    Java 8并发教程:原子变量和ConcurrentMap

    参考链接: Java ConcurrentMap接口 原文地址:http://winterbe.com/posts/2015/05/22/java8-concurrency-tutorial-atomic-concurrent-map-examples / 欢迎阅读我的Java 8中多线程编程教程系列的第三部分。 本教程介绍了并发API的两个重要部分:原子变量和并发映射。 在最新的Java 8版本中引入了lambda表达式和功能编程,两者都得到了很大的改进。所有这些新功能都用一大堆易于理解的代码示例进行描述。 ConcurrentMap ConcurrentMap扩展了映射接口,并定义了最有用的并发收集类型之一。 Java 8通过向此界面添加新方法来引入功能编程。 8并发的教程系列的第三部分。

    94320发布于 2021-04-20
  • 来自专栏路人甲Java

    java并发系列 - 第8天:线程组

    java并发系列第8篇文章 线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图: ? :
    * time:2019/7/13 17:53
    * author:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务 > * time:2019/7/13 17:53
    * author:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务 java并发系列目录: 1.java并发系列-第1天:必须知道的几个概念 2.java并发系列-第2天:并发级别 3.java并发系列-第3天:有关并行的两个重要定律 4.java并发系列 - 第4天:JMM相关的一些概念 5.java并发系列第5天-深入理解进程和线程 6.java并发系列 - 第6天:线程的基本操作 7.java并发系列 - 第7天:volatile与Java内存模型

    62330发布于 2019-12-10
  • 来自专栏程序猿的大杂烩

    Java并发编程(8)- 应用限流及其常见算法

    [TOC] ---- 应用限流 在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流: 缓存:缓存的目的是提升系统访问速度和增大系统处理容量 降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉 ,待高峰或者问题解决后再打开 限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 本文仅针对限流做一些简单的说明

    74430发布于 2020-09-23
  • 来自专栏产品优化

    Java 并发编程·Java 并发

    Java 并发 线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 時雨:在 《Java 并发核心知识体系精讲》中,参考 Oracle 官方文档,标注实现多线程方式只有两种:实现 Runnable 接口和继承 Thread 类。 8 9 9 2. 内存间交互操作 Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 在 Java 内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    3.2K32编辑于 2022-12-01
  • 来自专栏芋道源码1024

    并发而生的 ConcurrentHashMap,基于 Java8 分析

    来源:cnblogs.com/yangming1996/p/8031199.html 一、历史版本的实现演变 二、重要成员属性的介绍 三、put 方法实现并发添加 四、remove 方法实现并发删除 当然,它毕竟不是并发容器,除非大改,否则依然是不能应对高并发场景的,或者说即使没有因多线程访问而造成什么问题,但是效率必然是受到影响的。 本篇文章将要介绍的 ConcurrentHashMap 是 HashMap 的并发版本,它是线程安全的,并且在高并发的情境下,性能优于 HashMap 很多。 三、put 方法实现并发添加 对于 HashMap 来说,多线程并发添加元素会导致数据丢失等并发问题,那么 ConcurrentHashMap 又是如何做到并发添加的呢? = 0) { //链表深度超过 8 转换为红黑树 if (binCount >= TREEIFY_THRESHOLD) treeifyBin

    53610发布于 2020-09-22
  • 来自专栏悠扬前奏的博客

    Java并发-8.线程的构造启动,中断,完成

    抛出InterruptedException之前,JVM会清除线程中断位,所以此时调用isInterrupted()方法返回false 代码示例: import java.util.concurrent.TimeUnit : sleep interrupted at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java :340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.junzerg.threads.SleepUtils.second (SleepUtils.java:11) at com.junzerg.threads.Interrupted$SleepRunner.run(Interrupted.java:39) at java.lang.Thread.run(Thread.java:748) 可以看到,抛出InterruptedException的线程SleepThread的中断位被清除了。

    64220发布于 2019-05-28
  • 来自专栏我是攻城师

    理解Java8并发工具类ConcurrentHashMap的实现

    前面的文章已经分析过List和Queue相关的接口与并发实现类,本篇我们来分析一下非常Java里面非常重要的一个数据结构HashMap。 我们先看下Java里面一些常见的Map类型: 线程不安全的Map: HashMap (允许key和value都为null) TreeMap (允许value为null) LinkedHashMap (允许 不安全的Map在多线程下使用肯定是会有问题的,这毋庸置疑,比如JDK8之前的HashMap在高并发下如果有多个线程同时采用头插法扩容链表操作,那么将会有很大几率导致链表闭链,从而引发死循环导致CPU占满 不难发现采用这种方式,并发粒度还是太粗了,对于同一个Segment下面不同的数组链表数,如果有多个线程访问仍然要等待,所以在jdk8中取消了分段锁的思想,改用基于CAS自旋+synchronized控制并发操作 总结: 本文主要介绍了Java8里面HashMap的相关内容并着重介绍了ConcurrentHashMap的实现和核心方法分析,HashMap是我们日常开发中使用频率最高的类之一,而ConcurrentHashMap

    1.2K20发布于 2018-09-30
  • 来自专栏我是攻城师

    深入理解Java8并发工具类StampedLock

    StampedLock类是JDK8里面新增的一个并发工具类,这个类比较特殊,在此之前我们先简单的了解一下关于数据库或者存储系统的锁策略和机制。 对于一个高并发的应用程序来说,数据库常常会成为一个访问的瓶颈,这里面主要存在以下的几种访问情况: (1)读读并发 (2)读写并发 (3)写写并发 一般情况下,数据库都会有读共享写独占的锁并发的方案,也就是说读读并发是没问题的 } finally { // 释放锁(6) sl.unlock(stamp); } } } 总结: 本文主要介绍了JDK8里面新增的并发工具类 https://docs.oracle.com/javase/8/docs/api/ https://www.jianshu.com/p/481071ddafd3 https://netjs.blogspot.com /2016/08/stampedlock-in-java.html

    70920发布于 2018-09-30
  • 来自专栏look Java

    😀 Java并发 - (并发基础)

    Java并发 - (并发基础) 1、什么是共享资源 堆是被所有线程共享的一块内存区域。在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例 Java中几乎所有的对象实例都在这里分配内存。 为了提高性能,编译器和处理器常常会对指令做重排序; 重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。 参考地址:https://zhuanlan.zhihu.com/p/298448987 3、JMM 并发编程的关键目标 并发编程需要处理两个关键问题,即线程之间如何通信和同步。 并发编程的内存模型 共有两种并发编程模型:共享内存模型、消息传递模型,Java采用的是前者。 Model的缩写,Java线程之间的通信由 JMM 控制,即 JMM决定一个线程对共享变量的写入何时对另一个线程可见。

    48010编辑于 2023-12-07
  • 来自专栏Ywrby

    8-并发

    并发包 概念 在实际开发中不考虑线程安全的情况下,一般不需要做线程安全处理,防止过多的处理导致性能变差 但是开发中有很多业务需要考虑线程安全的相关问题,此时就必须考虑线程安全的处理 Java为很多业务场景提供了性能优异 ,且线程安全的并发包 ConcurrentHashMap package ConcurrentHashMap; import java.util.HashMap; import java.util.Hashtable ; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class CHMDemo1 { 在t1,t2执行完之前,后续主线程都不会执行 * 这就避免了提前打出maps长度导致结果并不是最终运行的结果 * 同时t1,t2都用到了join方法,所以二者之间仍然是并发执行 用户8正在执行! 用户7正在执行! 用户0正在执行! 用户9正在执行! 五个任务全部执行完毕,用户7开始执行! 五个任务全部执行完毕,用户9开始执行!

    1K10编辑于 2022-10-27
  • 来自专栏nice_每一天

    Java并发编程二】Java并发

    1.Java容器 1.1.同步容器 Vector ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。 NullPointerException(); 5 } 6 7 // Makes sure the key is not already in the hashtable. 8 这个机制允许任意数量的读线程可以并发访问Map,读者和写者也可以并发访问Map,并且有限数量的写进程还可以并发修改Map,结果是为并发访问带来更高的吞吐量,同时几乎没有损失单个线程访问的性能。    并发队列 2.1.ConcurrentLinkedQueue ConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无所的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue 在Java中,BlockingQueue的接口位于java.util.concurrent 包中(在Java5版本开始提供),由上面介绍的阻塞队列的特性可知,阻塞队列是线程安全的。

    1K10发布于 2019-05-10
  • 来自专栏JavaEdge

    Java并发编程实战系列8之线程池的使用

    ThreadPoolExecutor UML图: image image 8.1 在任务和执行策略之间隐形耦合 避免Thread starvation deadlock 8.2 设置线程池大小

    80490发布于 2018-04-28
  • 来自专栏后端精进之路

    Java并发编程系列-(5) Java并发容器

    5 并发容器 5.1 Hashtable、HashMap、TreeMap、HashSet、LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比。 在JDK8及以后,可以通过如下指令来获取到所有的hash算法, java -XX:+PrintFlagsFinal | grep hashCode 具体大概有如下几种,第5个算法是默认使用的,用到了异或操作和一些偏移算法来生成 ---- 参考: https://tech.meituan.com/2016/06/24/java-hashmap.html https://juejin.im/post/5aa5d8d26fb9a028d2079264 concurrencyLevel 并发度:默认16。 在高并发下的情况下如何保证取得的元素是最新的?

    48510编辑于 2023-10-19
  • 来自专栏迁移内容

    彻底理解Java并发Java并发工具类

    本篇内容包括:Java 并发工具类的介绍、使用方式与 Demo,包括了 CountDownLatch(线程计数器)、CyclicBarrier(回环栅栏)、Semaphore(信号量) 以及 Exchanger CountDownLatch(线程计数器) CountDownLatch 线程计数器,俗称闭锁,作用是类似加强版的 Join,是让一组线程等待其他的线程完成工作以后才执行 CountDownLatch 类位于 java.util.concurrent Demo(工厂有 5 台机器,有 8 个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用): public static void main(String[] args) { int N = 8; //工人数 Semaphore semaphore = new Semaphore(5); //机器数目 for (int i

    78220编辑于 2022-12-01
  • 来自专栏迁移内容

    彻底理解Java并发Java并发原子类

    在 Jdk1.5 开始 Java 开始引进提供了 java.util.concurrent.atomic 包,到 Jdk8 时,atomic 包共提供了 16 个原子类,分为 6 种类型,分别是:①、基本类型原子类 当多线程更新变量的值时,可能得不到预期的值,当然增加 syncronized 关键字可以解决线程并发的问题。但原子类提供了一种用法简单,性能高效,线程安全的更新变量的方式。 原子类相较于 synchronized 关键字和 lock,有着以下的优点: 简单:操作简单,底层实现简单 高效:占用资源少,操作速度快 安全:在高并发和多线程环境下要保证数据的正确性 但是,在并发量很大的场景下,Atomic 基本类型原子类(AtomicInteger 和 AtomicLong)有很大的性能问题。

    81620编辑于 2022-12-01
领券