- 博客(494)
- 收藏
- 关注
原创 Java高并发28-ThreadPoolExecutor原理剖析(2)
线程池转换状态如下:Running->Shutdown 显示调用shutdown()或隐式调用finalize()中的shutdown()Running或者Shutdown->Stop 显示调用shutdownNow()Shutdown->Tidying 当线程池和任务队列都是空的时候Stop ->TidyingTidying -> Terminated线程池类型如下newFixedThreadPool创建一个核心线程数和最大线程个数为都为nThr
2021-07-30 00:03:47
80
原创 Java高并发27-ThreadPoolExecutor原理剖析(1)
类图线程池的好处:(1)性能好;(2)工厂方法便捷创建线程,个数自定义指定类图描述Excutors其实是一个工具类,ThreadPoolExecutor继承了AbstractExecutorService,成员变量ctl是一个Integer的原子变量,用来记录线程池的状态和线程池中的线程个数这个Integer原子变量,前三位代表的是线程池的状态,后面29位代表的是线程池中线程的个数private final AtomicInteger ctl = new AtomicInteger
2021-07-06 23:02:43
103
原创 Android连载40-ITelecomService详解
一、拨号流程总结DialpadFragment提供用户拨号的交互界面CallIntentBuilder创建拨号请求的intent对象TelecomManager继续传递拨号请求intent对象二、ITelecomService接收拨号请求服务/packages/services/Telecomm/src/com/android/server/telecom这个代码库编译出来就是Telecom.apk Android应用程序,后面统一称为Telecom应用 <serv
2021-04-29 00:37:55
568
原创 Android连载39-简析HAL、拨号盘
一、简析HAL结构HAL是一个位于操作系统和驱动程序之上,运行在用户空间中的服务程序。目的:对上层应用提供一个统一的查询硬件设备的接口。好处:简化了应用程序查询硬件的逻辑注意:HAL所谓的抽象不提供对硬件的实际操作,对硬件的操作仍然由具体的驱动程序来完成。1.android为什么引入HAL由于安卓是基于Linux内核进行开发,而linux内核使用GPL许可证,这就要求,使用到这个许可证的软件,对开源软件的任何修改扩充都必须开源,如果引入了HAL,就可以让android系统层和内核靠HAL隔
2021-04-27 00:18:25
383
原创 Java高并发26-释放锁以及ReentrantLock实例演示
一、释放锁1.void unlock()方法尝试释放锁,如果当前线程持有锁,则调用该方法会让该线程对该线程持有的AQS状态值减1,如果减去1后当前状态值为0,则当前线程会释放该锁,否则仅仅减去1而已,如果当前线程没有持有该锁而调用了该方法就会抛出IllegalMonitorStateException异常,代码如下 public void unlock() { sync.release(); } public final boolean tryRelease( int releases
2021-04-16 00:05:58
293
2
原创 Java高并发25-独占锁ReentranLock的原理
一、类图结构ReentrantLock是一个可重入锁,只有一个线程可以获取到该锁,其他线程想要获取该锁的时候会被放到AQS队列中。从类图中可以看到实现了Lock接口,内含一个Sync类型变量,该类型是继承自AQS抽象类,同时又有两个继承了类,分别为公平锁和非公平锁。 Sync sync; public ReentrantLock() { sync = new NonfairLock(); } public ReentrantLock(boolean fair) { sync
2021-03-31 00:13:15
409
原创 Java高并发24-使用自定义锁生成一个消费模型
一、使用自定义锁实现生成–消费模型1.下面我们使用上节自定义的锁实现一个简单的生产–消费模型,代码如下:package com.ruigege.LockSourceAnalysis6;import java.util.Queue;import java.util.concurrent.locks.Condition;public class Test { final static NonReentrantLock lock = new NonReentrantLock(); final s
2021-03-05 00:19:58
138
2
原创 Java高并发连载23-基于AQS实现自定义同步器
一、在如下代码中,当另外一个线程调用条件变量的signal方法的时候(必须先调用锁的lock方法获取锁),在内部会把条件队列里面队头的一个线程节点从条件队列里面移除并且放入AQS的阻塞队列里面,然后激活这个线程。public final void signal() { if(!isHeldExclusively()) { throw IllegalMonitorException(); } Node first = firstWaiter; if(first != null){ //
2021-02-26 00:26:33
127
1
原创 JavaScript连载38-编写评论界面
一、编写评论页面<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>D38_1_Review</title> <style> *{ margin:0; padding:0; list-style:none; }
2021-02-24 00:28:39
190
原创 Java高并发22-AQS条件变量的支持
一、入队操作当一个线程获取锁失败之后会被转换为Node节点,然后会使用enq方法,将该节点插入到AQS的阻塞队列,下面看一下这个方法如何实现 private Node enq(final Node node) { for(;;) { Node t = tail; if( t == null) { if(compareAndSetHead(new Node())) { tail = head; } }else { node.prev = t;
2021-02-22 23:01:14
120
原创 Java高并发21-AQS在共享,独占场景下的源码介绍
七、源码:所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...
2021-01-31 18:55:18
223
原创 Java高并发20-并发包中锁原理解析(二)
一、例子下面来一个例子加深对park和unpark的理解package com.ruigege.LockSourceAnalysis6;import java.util.concurrent.locks.LockSupport;public class TestParkAndUnpark { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(ne
2021-01-23 15:40:28
210
原创 Java高并发19-并发包中锁原理解析(一)
二、源码:所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...
2021-01-17 00:25:33
142
原创 Java高并发18-并发列表CopyOnWriteArrayList源码解析
一、CopyOnWriteArrayList概览:该List是一个JUC包中的唯一并发List,它是线程安全的,底层是一个数组,我们所有的操作都是使用了写时复制的策略,下面这张图片就是该类的一个类图1.类图基本解释有一个独占锁ReentrantLock用于锁定线程,同一时间只能由一个线程进行修改。2.初始化首先看无参构造函数,创建一个大小为0的数组 private transient volatile Object[] array; public CopyOnWriteA
2021-01-09 23:43:41
178
原创 Java高并发17-LongAccumulator类详解
一、LongAccumulator类1.和LongAdder之间的关系LongAdder类是LongAccumulator的一个特例,我们看一下LongAccumulator的一个构造方法 public LongAccumlator(LongBinaryOperator accumulatorFunction,long identity) { this.function = accumulatorFunction; base = this.identity = identity; }
2021-01-07 23:13:48
390
原创 Java高并发16-LongAdder类源码解析(下)
一、复习二、 final void longAccumulate(long x,LongBinaryOperator fn,boolean wasUncontended) { //初始化当前线程的变量threadLocalRandomProbe的值 int h; if(h = getProbe() == 0) { ThreadLocalRandom.current(); h = getProbe(); wasUncontended = true; } boolean
2021-01-05 23:45:43
161
原创 Java高并发16-LongAdder类源码解析(上)
一、复习二、三、源码:所在包:com.ruigege.AtomicOperationClass4https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...
2020-12-26 00:30:01
2228
4
原创 Java高并发15-AtomicLong等原子类源码解析
一、复习二、Java并发包中一些原子操作类的源码解析1.常见类例如AtomicLong,AtomicInteger,AtomicCharacter…等这些操作类其内部实现都是通过CAS非阻塞算法来实现, 因此我们只要弄懂一个其他就基本知晓了,因此本文讲解AtomicLong类的实现原理AtomicLong还有LongAdder,LongAccumulator等类是对AtomicLong特性的增强,我们后面再说2.AtomicLong类优点:使用CAS非阻塞算法实现并发,比使用synchro
2020-12-19 22:09:23
319
原创 Java高并发14-多线程下ThreadLcoalRandom源码解析以及对比
一、复习二、Java并发包中的ThreadLocalRandom类1.起源以及优点ThreadLocalRandom类是在JDK7的JUC包开始新增的类,弥补了Random类在高并发环境下的缺点2.Random类以及局限性java.util.Random类是一种常用的随机数生成器,在java.land.Math中的随机数也是使用的Random的实例,下面先举个例子package com.ruigege.PricipleAnalyzingOfThreadLocalRandom3;imp
2020-12-13 16:58:03
183
原创 如何做一个自动化感应垃圾桶
简介上面的视频就是制作成型的感应式垃圾桶,手靠近感应器的时候,就可以自动开盖大概一秒,自动再盖上,它的用处可大了,比如:用来喝水,用来泡面或者用来当笔筒,总之垃圾桶能干的事情,它一样都干不了??????来合个影缘起哈哈哈,看到抖音使用树莓派、单片机等等小玩意,制作好玩的东西,于是决定在家也玩一玩破板子,破感应器,破垃圾桶,破蜂鸣器制作一个感应垃圾桶。必须要在无聊的生活中自己找寻乐趣!!!硬件简介超声波感应器前面两个圆柱形的东西就是一个超声波感应器,一个是发射口,一个是接收口,基本工
2020-12-12 16:53:00
5241
2
原创 Java高并发13-公平锁与非公平锁、自旋锁、可重入锁
一、复习二、公平锁与非公平锁按照线程请求并获得锁的时间顺序,可以将锁分为公平锁和非公平锁公平锁:线程获取锁的顺序是按照线程请求锁的时间早晚来进行划分的,也就是满足先到先得的原则;非公平锁:线程在运行时闯入的,并不是按照先到先得的原则。1.Java中两种锁的实现机制Reentrant reentrant = new Reentrant(true)代表公平锁Reentrant reentrant = new Reentrant(false)代表非公平锁如果构造函数不传入参数的话,那么默认就
2020-12-08 00:02:48
222
原创 Java高并发12-避免伪共享和锁机制
六 、源码:所在包:com.ruigege.OtherFoundationOfConcurrent2https://github.com/ruigege66/ConcurrentJavaCSDN:https://blog.csdn.net/weixin_44630050博客园:https://www.cnblogs.com/ruigege0000/欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流...
2020-12-03 00:15:29
319
原创 Java高并发11-伪共享,getUnsafe源码解析并利用反射获取Unsafe实例
一、复习二、getUnsafe源码解析private static final Unsafe unsafe = new Unsafe();public static Unsafe getUsafe(){ Class localClass = Reflection.getCallerClass(); if(!VM.isSystemDomainLoader(localClass.getClassLoader())){ throw new SecurityException("Unsafe");
2020-11-29 00:20:35
356
原创 Java高并发10-Unsafe类中其他方法以及测试
一、复习二、Unsafe类中的其他方法1.public native long getLongvolatile(Object obj,long offset)该方法用于获取对象obj地址偏移量为offset长度的对应volatile语义的值2.void putLongvolatile(Object obj,long offset,long value)该方法用于在对象obj地址偏移量为offset长度的类型为long的field值设置为value,支持volatile3.void put
2020-11-26 00:26:43
313
原创 Java高并发9-CAS操作与Unsafe类详解
一、复习计算机内存模型,synchronized和volatile关键字简介二、两者对比sychronized和volatile都解决了内存可见性问题不同点:(1)前者是独占锁,并且存在者上下文切换的开销以及线程重新调度的开销;后者是非阻塞算法,不会造成上下文切换的开销。(2)前者可以保证操作的原子性,但是后者不能保证操作的原子性。三、在什么情况下才会使用volatile写入变量是不依赖当前值的,如果是依赖当前值的话,由于获取-计算-写入,三者不是原子性操作,而volatile是保
2020-11-23 23:54:52
180
原创 Java高并发8-计算机内存模式以及volatile,sychronized工作原理
一、复习二、多CPU的好处减少线程上下文切换的开销三、 计算机的内存模型一块主内存,然后被多个线程所调用,每个线程又有自己的一级缓存,线程共享了二级缓存出现的问题:一级缓存是每个线程自己独有的,运行的时候,会先去一级缓存里面找,如果没有再去二级缓存,最后去内存,所以如果多个线程对一个共享变量操作的话,就会导致一级缓存里放置的数据是过期的,因此会产生问题。下面这张图是一个计算机架构模型每个核心都有自己的四、源码:所在包:com.ruigege.ThreadFoundation
2020-11-20 00:16:25
248
2
原创 Java高并发7-inheritableThreadLocal实现父子线程变量同步原理
一、二、threadLocal不具有继承性package com.ruigege.threadFoundation1;public class ThreadLocalExtend { public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { Thread thread = new Thread(new
2020-11-13 00:11:23
350
原创 Java高并发6-ThreadLocal内部各种方法实现原理
一、复习二、ThreadLocal实现原理1.首先看一下Thread类Thread类中有两个成员变量ThreadLocalMap threadLocalsThreadLocalMap inheritableThreadLocals2.然后再看一下TheadLocal类中的成员方法void set(T value)T get()ThreadLocalMap getMap(Thread t)void remove()T setInitialValue()void createMap
2020-11-10 00:29:07
190
原创 Java高并发5-守护线程、ThreadLocal和死锁四个必要条件
一、复习void interrupt()、boolean isInterrupted()、boolean interrupted()interrupt()方法只是为了做一个“中断”的标记,而不会真的停止该线程、isInterrupted是返回线程的中断状态、interrupted()方法也是一样的,但是这是一个static方法,可以直接调用而且根据源码,是所在的线程的中断状态,而且如果结果为true,它会立即消除“中断”状态。二、上下文切换定义:CPU会给各个线程分配时间片,当一个线程的时间片
2020-11-06 00:16:52
299
原创 Java高并发4-解析volatile关键字
一、复习二、volatile解析1.计算机内部的内存模型我们知道计算机内部含有内存和CPU,那么在进行计算的时候,内存读写还是太慢了,因此在内存和CPU之间还是有一个缓存cache那么我们知道如果是一个共享变量的话,就会导致,内存中变量和缓存中的变量由于多线程同步不及时,也就是说,一个线程中的缓存还没来的急写入内存,此时有可能在内存中的变量被其他线程读取了。解决这个问题可以:1)通过在总线加LOCK#锁的方式;2)通过缓存一致性协议第一种方式效率低下,很难实现多线程;第二种方式有一个著名MSI
2020-11-04 00:18:06
227
原创 Java高并发3-中断线程以及isInterrupted与interrupted区别
一、复习上一节内容wait()方法、中断正在运行的线程会抛出java.lang.InterruptedException、当线程调用共享对象的wait()方法时,当前线程只会释放当前共享变量的锁,不会释放该线程所持有的其他共享变量的锁。wait(long timeout,int nanos)实现、wait(0)内部调用了wait()方法、notify()随机唤醒、notifyAll()全部唤醒、join方法、sleep方法、yield方法,以及sleep与yield方法的区别二、线程中断inter
2020-10-31 00:03:34
599
原创 Java高并发2-线程wait、sleep、yield、notify、join方法总结
一、复习上次连载两个基本单位线程进程的组成程序计数器定义以及执行native方法时是什么三种创建方式:extends Thread 重写run new 实例().start();implements Runnable 重写run new Thread(new 实例()).start();implements Callable 重写call(),有返回值 new FutureTask<返回值类型>(new 实例()) new Thread(new Fut
2020-10-29 00:06:51
343
原创 Java高并发1-创建线程的三种方式、虚假唤醒、native关键字
一、创建多线程的两种方式1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法3.直接上代码package com.ruigege.threadFoundation1;public class MyThreadExtendsType extends Thread { @Override public void run() { System.out.println("这是一个继承Thread类的多线程表示方法"); }}package com.r
2020-10-25 23:53:29
245
原创 Android连载38-访问联系人
一、读取手机中的联系人由于使用模拟器,我们首先创建几个联系人再进行读取然后创建一个项目ContactsTest,修改activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" andr
2020-10-15 00:29:58
175
原创 JavaScript连载37-切换选项卡样式以及搭建一个评论系统
一、选项卡使用函数来动态的显示标签的样式,也可以使用html自带的动画效果来实现下面的操作<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>D37_1_OptionCard</title> <style> *{ margin:0; paddi
2020-10-13 23:49:55
173
原创 Java连载144-反射和自定义注解
一、定义注解使用前提:使用@interface来进行声明,会自动继承java.lang.annotation.Annotation接口注解中的每一个方法实际上是声明了一个配置参数,方法的名称就是参数的名称,返回值的类型就是参数的类型,返回值只能是基本类型、Class、String、Enum,可以通过default关键字声明参数的默认值语法如下[public|final] @interface 注解名{ 注解元素}注意:(1)不可与i继承其他注解或者接口;(2)@interface只能
2020-10-12 00:13:36
243
原创 Java连载143-三种系统注解
一、注解功能用处:类、构造方法、成员方法、方法、参数等声明中特性:不影响程序的正常执行,但是会对编译器等辅助工具产生影响定义:添加到Java程序代码上,用来做一些说明和解释1.元数据定义:用于描述数据的一种数据可使用注解来描述元数据。2.注解又称为标注,属于程序的元数据,也是程序代码的标记。获得时间:编译、加载类和运行使用反射可以对程序代码进行分析使用系统定义的注意,可以在编译时对程序进行检查使用元注解,可以生成相应的文档用在的地点:包、类、字段、方法、局部变量、方法参数
2020-10-11 00:28:59
139
原创 C连载27-练习计算和数据类型
一、练习计算和数据类型#include<stdio.h>#pragma warning(disable:4996)const int S_PER_M = 60; //1分钟的秒数const int S_PER_H = 3600; //1小时的秒数const double M_PER_K = 0.62137; //1公里的英里数int D27_1_running(void) { double distk, distm; //跑过的距离(分别用以公里和英里为单位)
2020-10-10 00:24:44
174
原创 Android连载37-跨程序共享数据
一、内容提供器使用内容提供器来共享数据可以精确的进行控制,哪些数据可以共享,哪些数据不可以共享内容提供器有两种用法:(1)使用现有的内容提供器来读取和操作相应程序中的数据;(2)创建自己的内容提供器给我们的程序的数据提供外部访问接口二、ContentResolver的基本用法获取ContentResolver实例的方法: new Context().getContentResolver()该实例提供了一系列方法insert(),update(),delete(),query()用于CRUD
2020-10-09 00:31:17
131
原创 JavaScript连载36-上传文件以及获取input表单焦点
一、表单标签焦点 <input type="text" placeholder="请输入姓名"> <script> window.onload = function (ev) { var input = document.getElementsByTagName("input")[0]; //1.获得焦点,也就是按下鼠标的那个光标 input.onfocus = function
2020-10-04 19:34:57
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅