首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    Java并发学习4【面试+工作】

    Java并发学习4【面试+工作】 九.fork&join Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架 同步容器在单线程的环境下能够保证线程安全,但是通过synchronized同步方法将访问操作串行化,导致并发环境下效率低下。 并发容器 由上面的分析我们知道,同步容器并不能保证多线程安全,而并发容器是针对多个线程并发访问而设计的,在jdk5.0引入了concurrent包,其中提供了很多并发容器,极大的提升同步容器类的性能。 “分段锁”,JDK8中采用CAS无锁算法 CopyOnWriteArrayList 对应的非并发容器:ArrayList 目标:代替Vector、synchronizedList 原理:利用高并发往往是读多写少的特性 不会阻塞的队列 对应的非并发容器:Queue 原理:基于链表实现的FIFO队列(LinkedList的并发版本) BlockingQueue:数据共享通道 比如,线程A希望线程B发一个消息,用什么方式告知线程

    65620发布于 2018-07-26
  • 来自专栏卯金刀GG

    并发Java(4):无锁

    在高并发Java(1):前言中已经提到了无锁的概念,由于在jdk源码中有大量的无锁应用,所以在这里介绍下无锁。 1 shift = 31 - Integer.numberOfLeadingZeros(scale); 前导零的意思就是比如8位表示12,00001100,那么前导零就是1前面的0的个数,就是4

    79320发布于 2019-07-26
  • 来自专栏悠扬前奏的博客

    Java并发-4.锁基础

    0. 四种状态的锁 锁有四种状态:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态 根据竞争情况升级 锁可以升级不能降级 1. 偏向锁 大多数情况下,锁不存在多线程竞争,且总是由同一线程多次获得 线程访问同步块并获取锁,就在对象头和栈帧中的锁记录里存储偏向锁ID,之后线程出入同步块就不需要CAS来加锁和解锁,只是测试对象头的Mark Word里是否存在指向该线程的偏向锁。测试成功,线程获得锁,失败,就测试Mark Word中锁标识是否是1(当前锁是偏向锁):没有设置,用CAS竞争锁;设置了,用CAS将对象头

    30130发布于 2019-05-28
  • 来自专栏Java Web

    Java学习笔记(4)——并发基础

    并行与并发 并行性和并发性是既相似又有区别的两个概念。 并行性是指两个或多个事件在同一时刻发生。而并发性是指连个或多个事件在同一时间间隔内发生。 如果在计算机系统中有多个处理机,这些可以并发执行的程序就可以被分配到多个处理机上,实现并发执行,即利用每个处理机爱处理一个可并发执行的程序。这样,多个程序便可以同时执行。 [1] main——main线程,用户程序入口 [2] Reference Handler——清除Reference的线程 [3] Finalizer——调用对象finalize方法的线程 [4] 处理两个文件则需要: 1| 5秒读取文件A 2| 2秒处理文件A 3| 5秒读取文件B 4| 2秒处理文件B 5| --------------------- 6| 总共需要14秒 从磁盘中读取文件的时候 看下面的顺序: 1| 5秒读取文件A 2| 5秒读取文件B + 2秒处理文件A 3| 2秒处理文件B 4| --------------------- 5| 总共需要12秒 CPU等待第一个文件被读取完

    1K30发布于 2018-04-26
  • 来自专栏changxin7

    4.并发编程多线程

    并发编程之多线程(理论) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https:/ t.start() 九 Python GIL(Global interpreter Lock) 首先,一些语言(java、c++、c)是支持同一个进程中的多个线程是可以应用多核CPU的,也就是我们会听到的现在4核 但是有了这个锁我们就不能并发了吗? 033[45m[%s]正在检查mysql\033[0m' % threading.current_thread().getName()) time.sleep(random.randint(2,4) # 37220打印的: 0 # 32292打印的: 4 # 33444打印的: 1 # 30068打印的: 2 # 29884打印的: 3 # 主线程 # >>>> 0 # >>>> 1 # >>>>

    99010发布于 2019-09-10
  • 来自专栏java开发的那点事

    JUC 常用4并发工具类

    JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西   该包的位置位于java下面的rt.jar包下面 4大常用并发工具类:   CountDownLatch } } } public static void main(String[] args) { for (int i = 0; i <= 4; 执行结果: bSetA bSetB bSetC aSet1 aSet2 aSet3 通过执行结果可以清晰的看到,两个线程中的数据发生了交换,这就是Exchanger的线程数据交换了 以上就是JUC的4大常用并发工具类了 作者:彼岸舞 时间:2020\09\26 内容关于:并发编程 本文来源于网络,只做技术分享,一概不负任何责任

    91831发布于 2020-11-06
  • 来自专栏测试开发干货

    接口测试平台188: 并发报告(4

    好的,本节课我们要解决的就是 上节课我们拼好的json中的 各层级的result结果:

    38230编辑于 2022-05-20
  • 来自专栏博客专享

    并发设计模式实战系列(4):线程池

    今天为大家带来的是并发设计模式实战系列,第四章线程池(Thread Pool)​,废话不多说直接开始~ 一、核心原理深度拆解 1. ThreadPoolExecutor构造 private static final ExecutorService pool = new ThreadPoolExecutor( 4, // 核心线程数(对应4核CPU) 8, // 最大线程数(4核*2) 30, TimeUnit.SECONDS, new ArrayBlockingQueue int corePoolSize = Runtime.getRuntime().availableProcessors() * 2; int maxPoolSize = corePoolSize * 4; 线程 │ 1虚拟线程对应1载体线程 │ │ 上下文切换成本高 │ 用户态轻量级切换 │ │ 适合CPU密集型任务 │ 适合高并发

    45910编辑于 2025-05-20
  • 来自专栏Ryan Miao

    java并发编程(4)--线程池的使用

    在上一节我们从宏观上介绍了ThreadPoolExecutor,下面我们来深入解析一下线程池的具体实现原理,将从下面几个方面讲解: 1.线程池状态   2.任务的执行   3.线程池中的线程初始化   4. ;然后就将任务也分配给这4个临时工人做;如果说这14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了。 当这14个工人当中有人空闲时,而新任务增长速度又比较缓慢,工厂主管就可能考虑辞掉4个临时工了,只保持原来的10个工人,毕竟额外的工人是要花钱的。 这个例子中的corePoolSize就是10,而maximumPoolSize就是14(10+4)。 已经执行完的任务数目:0 线程池中线程数目:2,队列中等待执行的任务数目:0,已经执行完的任务数目:0 线程池中线程数目:3,队列中等待执行的任务数目:0,已经执行完的任务数目:0 线程池中线程数目:4,

    99880发布于 2018-03-13
  • 来自专栏程序猿的大杂烩

    Java并发编程(4)- 线程安全策略

    答案是有的,那就是并发容器,有了并发容器后同步容器的使用也越来越少的,大部分都会优先使用并发容器。 本小节将简单介绍一下并发容器,并发容器也称为J.U.C,即是其包名:java.util.concurrent。 ---- 4.HashMap对应的ConcurrentHashMap HashMap的并发安全版本是ConcurrentHashMap,但ConcurrentHashMap不允许 null 值。 的4倍左右。 对于高并发程序,应当使用ConcurrentSkipListMap,能够提供更高的并发度。

    79930发布于 2020-09-23
  • 来自专栏c语言与cpp编程

    《C++并发编程实战》读书笔记(4):设计并发数据结构

    本文包括第6章设计基于锁的并发数据结构与第7章设计无锁数据结构,后者实在有些烧脑了。 此外,发现吴天明版的中译本有太多太离谱的翻译错误了,还得是中英对照才行:) 第6章 设计基于锁的并发数据结构 设计支持并发访问的数据结构时,一方面需要确保访问安全,通常需要限定其提供的接口,另一方面需要是按真正的并发操作 ,仅利用互斥保护并发实际上是串行化。 设计基于锁的并发数据结构的奥义就是确保先锁定合适的互斥,再访问数据,并尽可能缩短持锁时间。 可以采用锁实现线程安全的栈容器。 便于分析和推理; 2、使用无锁的内存回收方案,例如上面的引用计数; 3、防范ABA问题,即两次读取变量的值都相同,但其实变量已经被修改过多次,解决办法是将变量与其计数器绑定; 4

    72250编辑于 2023-08-10
  • 来自专栏后端进阶

    JUC 中 4 个常用的并发工具类

    已执行 2 已执行 1 已执行 全部执行完毕 0 已执行 1 已执行 2 已执行 3 已执行 4 已执行 全部执行完毕 Semaphore Semaphore 信号量维护了一个许可集,每次使用时执行acquire e.printStackTrace(); } } } 输出如下: 0 准备执行 2 准备执行 1 准备执行 3 准备执行 4 准备执行 2 已经执行 2 已经释放 4 已经执行 4 已经释放 1 已经执行 1 已经释放 0 已经执行 0 已经释放 3 已经执行 3 已经释放 Exchanger Exchanger 用于两个线程间的数据交换 交换得到数据为:pool-1-thread-2 pool-1-thread-2 交换得到数据为:pool-1-thread-1 pool-1-thread-3 等待交换 pool-1-thread-4 等待交换 pool-1-thread-4 交换得到数据为:pool-1-thread-3 pool-1-thread-3 交换得到数据为:pool-1-thread-4 pool-1-thread-5

    63710发布于 2021-11-10
  • 来自专栏狗哥的 Java 世界

    Java 并发4)AbstractQueuedSynchronizer 源码分析之条件队列

    reportInterruptAfterWait(interruptMode); } //返回剩余时间 return nanosTimeout - (System.nanoTime() - lastTime); } 4. //2.将头结点的后继结点引用置空 first.nextWaiter = null; //3.将头结点转移到同步队列, 转移完成后有可能唤醒线程 //4.

    64420发布于 2020-03-24
  • 来自专栏拭心的安卓进阶之路

    并发编程4:Java 阻塞队列源码分析(上)

    上篇文章 并发编程3:线程池的使用与执行流程 中我们了解到,线程池中需要使用阻塞队列来保存待执行的任务。这篇文章我们来详细了解下 Java 中的阻塞队列究竟是什么。 notFull; //... } 可以看到,ArrayBlockingQueue 使用可重入锁 ReentrantLock 实现的访问公平性,两个 Condition 保证了添加和获取元素的并发控制 LinkedBlockingQueue 比 ArrayBlockingQueue 的优势就是添加和获取是两个不同的锁,所以并发添加/获取效率更高些,因此数组元素个数用的是 AtomicInteger 类型的 ,这样在添加、获取时通过判断数组元素个数可以感知到并发的获取/添加操作 ;此外就是链表比数组的优势了。

    1.7K90发布于 2018-01-05
  • 来自专栏JUC并发原理与源码

    JUC并发4.wait和notify以及Atomic原理

    4.分布式存储系统的edits log机制介绍(1)高并发请求下NameNode会遇到的问题(2)通过双缓冲机制来提升写edits log的性能(1)高并发请求下NameNode会遇到的问题NameNode 如果针对同一块内存缓冲,同时有线程写入、同时有线程读取后刷入磁盘,那么是会存在并发读写问题的,因为不能并发读写一块共享内存数据。所以HDFS采取了双缓冲机制来处理,也就是将一块内存缓冲分成两部分。 LongAdder的实现原理是:高并发时通过Cell[ ]数组进行分段CAS。LongAdder的使用场景是:高并发下的全局计数器。 (4)LongAdder的源码分析//并发不高的时候,直接更新base,类似AtomicLong;//高并发的时候,将每个线程的操作hash到不同的cells数组中;//从而将AtomicLong中更新一个 当多个线程并发累加时,如果并发度低就直接加到base变量上,如果并发度高就分散到Cell变量上。在最后取值时,再把base变量和这些Cell变量进行累加求和运算。

    23400编辑于 2025-04-23
  • 来自专栏写代码和思考

    Go语言学习之旅 4 - Go 的并发原语

    Go语言学习笔记 3 - Go 的并发原语 概述 连续三节的内容如下: 第一节覆盖了基本语法及数据结构 第二节讨论了方法与接口 第三节则简单介绍了 Go 的并发原语。

    81500发布于 2020-03-16
  • 来自专栏后端精进之路

    Java并发编程系列-(4) 显式锁与AQS

    4 显示锁和AQS 4.1 Lock接口 核心方法 Java在java.util.concurrent.locks包中提供了一系列的显示锁类,其中最基础的就是Lock接口,该接口提供了几个常见的锁相关的操作 4. 公平锁 ReentrantLock内部利用AQS的线程队列,可以实现公平锁,但是性能相比非公平锁会差一点。 4.不管是ReadLock还是WriteLock都支持Interrupt,语义与ReentrantLock一致。 它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),是JUC并发包中的核心基础组件。 JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。 AQS解决了实现同步器时涉及到的大量细节问题,例如获取同步状态、FIFO同步队列。

    44820编辑于 2023-10-19
  • 来自专栏java工会

    JAVA多线程并发之线程实现,4种线程池,终止线程4种方式

    JAVA 并发知识库 ? 二. JAVA 线程实现/创建方式 1. 继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。 4. 基于线程池的方式 线程和数据库连接这些资源都是非常宝贵的资源。那么每次需要的时候创建,不需要的时候销 毁,是非常浪费资源的。那么我们就可以使用缓存的策略,也就是使用线程池。 ? 三. 4. 阻塞状态(BLOCKED): 阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice,暂时停止运行。 终止线程 4 种方式 1. 正常运行结束 程序运行结束,线程自动结束。 2. 使用退出标志退出线程 一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。 (4). 而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

    5.8K20发布于 2019-12-23
  • 来自专栏Python基础、进阶与实战

    Python中的并发编程(4)多线程发送网络请求

    work_queue.task_done() from threading import Thread from queue import Queue THREAD_POOL_SIZE = 4 如果存储的数量令牌大于或等于请求的数量,我们减少存储的令牌数量并返回该值 4. 如果存储的令牌数量小于请求的数量,我们返回零 两件重要的事情是 1.始终用零令牌初始化令牌桶(?)

    1.3K21编辑于 2023-12-19
  • 来自专栏java一日一条

    Java并发编程:4种线程池和缓冲队列BlockingQueue

    具体的4种常用的线程池实现如下:(返回值都是ExecutorService) 2.1 Executors.newCacheThreadPool():可缓存线程池,先查看池中有没有以前建立的线程,如果有, 1正在被执行,打印的值是:1 pool-1-thread-1正在被执行,打印的值是:2 pool-1-thread-1正在被执行,打印的值是:3 pool-1-thread-1正在被执行,打印的值是:4 在保证并发安全的同时,提高了队列的存取效率。 2.

    97610发布于 2019-01-23
领券