java多线程
文章平均质量分 80
chuixue24
这个作者很懒,什么都没留下…
展开
-
CyclicBarrier原理
线程3执行时,当调用int index = --count后,会index会变为0,那么if (index == 0)判断语句就成立了 ,并会执行 breakBarrier(),该方法中会调用trip.signalAll();将条件队列中的所有线程,即线程1和线程2移入同步队列,线程3释放锁之后,线程1和线程2依次获取锁执行。看ReentrantLock 以下源码, CyclicBarrier 类中有变量。可以推测出其实现依赖于ReentrantLock。原创 2023-04-14 17:56:51 · 129 阅读 · 0 评论 -
深入剖析ReentrantLock源码
看完了ReentrantLock的所有源码,是不是觉得ReentrantLock很简单。由于加锁流程的编排工作已经在父类AQS中实现,子类只需要实现具体的加锁逻辑即可。加锁逻辑也很简单,也就是修改同步状态state的值和持有锁的线程exclusiveOwnerThread。转载 2023-04-14 10:52:13 · 94 阅读 · 0 评论 -
重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似
AQS跟的加锁流程是一样的,都是通过同步队列和条件队列实现的,阻塞状态的线程被放到同步队列中,等待状态的线程被放到条件队列中,从条件队列唤醒的线程又被转移到同步队列末尾,一块竞争锁。看完AQS加锁流程,还没有人不懂AQS的?下篇文章再讲一下AQS加锁具体的源码实现。里面有很多精巧的设计,值得我们学习。比如:为什么同步队列要设计成双向链表?而条件队列要设计成单链表?为什么AQS加锁性能这么好(乐观锁CAS使用)?同步队列和条件队列中节点怎么用一个对象实现?释放锁后,怎么唤醒同步队列中线程?转载 2023-04-14 09:05:27 · 173 阅读 · 0 评论 -
再有人说synchronized是重量级锁,就把这篇文章扔给他看
synchronized锁经过多次迭代优化,已经不像以前那么重了,在JDK1.8的ConcurrentHashMap源码中已经大量使用synchronized做同步控制,大家在日常开发中可以放心使用了。转载 2023-04-14 09:01:04 · 134 阅读 · 0 评论 -
happen-before原则
Ahappens-beforeB,定义1要求A执行结果对B可见,并且A操作的执行顺序在B操作之前,但与此同时利用定义中的第二条,A,B操作彼此不存在数据依赖性,两个操作的执行顺序对最终结果都不会产生影响,在不改变最终结果的前提下,允许A,B两个操作重排序,即happens-before关系并不代表了最终的执行顺序。(5)start()规则如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。...转载 2022-07-21 10:11:45 · 970 阅读 · 0 评论 -
Java并发:线程池如何设置线程数
目录 一、理论分析 二、实际应用为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换)。但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。.转载 2022-02-08 17:38:27 · 1719 阅读 · 0 评论 -
Jetty线程模型
在近几年的开源Java容器市场上,Tomcat依旧保持在龙头老大的位置,其地位丝毫没有被撼动的迹象。与此同时Tomcat也因为架构臃肿结构复杂而饱受批评。作为Tomcat的另一款替代性的Java容器Jetty要比Tomcat简单很多,Jetty作为内嵌容器被开源社区广泛使用。基于Jetty之上有很多轻量级Java Web框架,比如著名的JFinal就是基于Jetty开发出来的。Jetty的线程架构模型非常简单,分为acceptors,selectors和workers三个线程池。acceptors负转载 2022-01-20 20:57:59 · 615 阅读 · 0 评论 -
线程池要设置多大
有个朋友Hunter跟我聊,最近他参加腾讯的面试,在二面的时候被问到了关于线程池线程数目设置的一个问题。此处记录下这个问题的面试过程,以及后面关于此问题的理论方面的知识讲解。面试过程面试官开场了:线程池你用过吧,线程数是怎么设置的呢?Hunter心想,这不难啊,曾经在《Java并发编程》一书中有看到过线程池中线程数目设置的讲述,于是张口就来:线程数的设置需要考虑三方面的因素,服务器的配置、服务器资源的预算和任务自身的特性。具体来说就是服务器有多少个CPU,多少内存,IO支持的最大QPS是多少转载 2021-12-20 17:17:23 · 3841 阅读 · 0 评论 -
CPU密集和IO密集
CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。 在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下 的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于原创 2021-10-12 13:52:55 · 559 阅读 · 0 评论 -
LockSupport中的park与unpark原理
关于LockSupportconcurrent包的基础Doug Lea 的神作concurrent包是基于AQS (AbstractQueuedSynchronizer)框架,AQS框架借助于两个类:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)。因此,LockSupport可谓构建concurrent包的基础之一。理解concurrent包,就从这里开始。两个重点操作对象归根结底,LockSupport调用的Unsafe中的native代码:.转载 2021-10-12 09:41:24 · 997 阅读 · 1 评论 -
线程状态切换
线程线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模 型,Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有 一个对应的线程。Java线程有多种生命状态:NEW,新建 RUNNABLE,运行 BLOCKED,阻塞 WAITING,等待 TIMED_WAITING,超时等待 TERMINATED,终结协程协程(纤程,用户级线程),目的是为了追求最大力度的发挥硬件性能和提升软件的速.原创 2021-10-08 12:58:05 · 359 阅读 · 0 评论 -
clinit方法的线程安全以及死锁
问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。那么有没有一种方式可以让一个进程同时为多个客户端端提供服务?接下来要讲的IO复用技术就是对于上述问题的最好解答。对于IO复用,我们可以通过一个例子来很好的理解它。(例子来自于《TCP/IP网络编程》)某教室有10名学生和1名老师,这些学生上课会不停的提问,所以一个老师处理不了这么多的问题。那么学校为每个学生都配一名老师,也就原创 2021-08-12 14:11:06 · 315 阅读 · 0 评论 -
深入解析 volatile 、CAS 的实现原理
在分析说明 volatile 和 CAS 的实现原理前,我们需要先了解一些预备知识,这将是对 volatile 和 CAS 有深入理解的基石。预备知识缓存现代处理器为了提高访问数据的效率,在每个CPU核心上都会有多级容量小,速度快的缓存(分别称之为L1 cache,L2 cache,多核心共享L3 cache等),用于缓存常用的数据。缓存系统中是以缓存行(cache line)为单位存储的。缓存行是 2 的整数幂个连续字节,一般为 32-256 个字节。最常见的缓存行大小是 64个字节。转载 2021-03-22 12:45:38 · 275 阅读 · 0 评论 -
java并发笔记
java并发笔记一之java线程模型https://www.cnblogs.com/yuhangwang/p/11295940.htmljava并发笔记二之证明 synchronized锁 是否真实存在https://www.cnblogs.com/yuhangwang/p/11295940.htmljava并发笔记三之synchronized 偏向锁 轻量级锁 重量级锁证明https://www.cnblogs.com/yuhangwang/p/11295940.html..原创 2021-01-14 23:33:53 · 104 阅读 · 0 评论 -
Java多线程Condition接口原理详解
Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的Condition接口详解Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创建出来的,换句话说,Condition是依赖Lock对象的。Lock lock = new ReentrantLoc转载 2021-01-03 11:22:59 · 154 阅读 · 0 评论 -
基础篇:深入JMM内存模型解析volatile、synchronized的内存语义
先介绍下多进程多线程在linux几种通信方式管道:管道的实质是一个内核缓冲区,需要通信的两个进程各在管道的两端,进程利用管道传递信息 信号:信号是软件层次上对中断机制的一种模拟,进程不必阻塞等待信号的到达,信号可以在用户空间进程和内核之间直接交互 消息队列:消息队列是消息的链表,存放在内存中并由消息队列标识符标识,允许多个进程向它写入与读取消息 共享内存:多个进程可以可以直接读写同一块内存空间,是针对其他通信机制运行效率较低而设计的 信号量:信号量实质上就是一个标识可用资源数量的计数器,它的值总转载 2021-01-02 18:25:15 · 162 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁的使用
类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性,但是效率低下。JDK提供了ReentrantReadWriteLock读写锁,使用它可以加快效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁ReemtrantReadWriteLock来提升该方法的运行速度。 读写锁表示有两个锁,一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也叫排他锁。也就是多个读锁之间不互斥,读锁与写转载 2020-11-12 14:38:49 · 282 阅读 · 0 评论 -
如何结束线程-线程中断
停止现成的方式线程停止的方式:线程执行完毕,自然会停止 异常退出 设置了标志位,当标志位为false时退出 线程中断退出(这也是一道常见面试题)线程函数执行完毕正常退出和发生异常被迫退出都不受我们控制,下面讨论控制线程停止的方式。设置退出标志位package com.sync.demo;import javax.swing.text.html.HTML.Tag;public class Demo5 { public static void main(String[] a转载 2020-10-14 08:58:22 · 300 阅读 · 0 评论 -
Java阻塞队列
本篇文章主要是介绍Java并发包中的几种阻塞队列和阻塞原理背景阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。.转载 2020-08-03 13:55:16 · 176 阅读 · 0 评论 -
ReentrantReadWriteLock用法
介绍ReentrantLock是互斥排他锁,同一时间只能有一个线程在执行任务,ReentrantLock支持锁的重入功能,虽然保证了线程的安全性,但是效率不高,实际上应该是写操作互斥,读操作共享。而jdk提供了读写锁ReentrantReadWriteLock。读读共享public class MyTask { private ReentrantReadWriteLo...转载 2020-04-27 18:12:33 · 654 阅读 · 0 评论 -
java线程池实例(利用多线程将400万数据导入到Elasticsearch)
项目中需要用到ES,在写完接口后,对ES进行测试时,需要导入100万,400万,500万数据,分三次导入。在用java代码导入时,100万数据用时40分钟。后边还有两次400万和500万的数据导入。所以利用多线程提高导入效率。我本地机器测试时,线程池的大小设为100时,性能最佳。导入100万数据时单线程写法:导入耗时:2439796毫秒=2439.7秒=40.7分钟...原创 2020-02-25 00:20:40 · 3213 阅读 · 3 评论